You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 16下UIImage缩放重绘函数异常问题排查

iOS 16下UIImage缩放函数失效的关键原因及修复

你的缩放函数在iOS 16下失效的关键问题出在UIImage的draw(in:)方法对图片方向(orientation)的处理逻辑变化。

在iOS 16之前,UIImage.draw(in:)会自动根据图片的exif方向信息旋转、翻转图片,确保绘制结果符合视觉预期;但iOS 16调整了这一行为,带有非.up方向的图片调用draw(in:)时,不再自动应用方向变换,导致绘制出来的图片尺寸、位置与计算值不符,出现拉伸、偏移或裁剪问题。

你的代码中直接使用原始图片的size(已修正方向的尺寸)计算缩放后的newWidth和newHeight,但绘制时因为方向未被自动修正,实际绘制的是原始像素方向的图片,两者不匹配就会出现显示异常。


修复方案

在缩放前先将图片转换为方向归一化(.up)的版本,确保尺寸计算和绘制行为一致:

  1. 给UIImage添加归一化方向的扩展方法:
extension UIImage {
    func normalizedOrientation() -> UIImage {
        guard imageOrientation != .up else { return self }
        
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        draw(in: CGRect(origin: .zero, size: size))
        let normalizedImage = UIGraphicsGetImageFromCurrentImageContext() ?? self
        UIGraphicsEndImageContext()
        
        return normalizedImage
    }
}
  1. 在你的scaledWithMaxWidthOrHeightValue函数开头,先将当前图片归一化:
let normalizedImage = self.normalizedOrientation()
let width = normalizedImage.size.width
let height = normalizedImage.size.height

后续所有尺寸计算和draw(in:)调用都使用normalizedImage替代原self即可。


内容的提问来源于stack exchange,提问作者kunass2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:35:24