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)的版本,确保尺寸计算和绘制行为一致:
- 给
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 } }
- 在你的
scaledWithMaxWidthOrHeightValue函数开头,先将当前图片归一化:
let normalizedImage = self.normalizedOrientation() let width = normalizedImage.size.width let height = normalizedImage.size.height
后续所有尺寸计算和draw(in:)调用都使用normalizedImage替代原self即可。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

