上下文菜单中UIImageView的scaleAspectFit属性不生效问题
问题根因
你的配置不生效是两处错误共同导致的:
- 图片缩放方法的scale参数配置错误:你调用
UIGraphicsBeginImageContextWithOptions时第三个参数传入了1.0,导致生成的UIImage的scale属性固定为1,和屏幕缩放倍率不匹配。你后续手动将图片像素尺寸除以屏幕scale得到的imageView尺寸,刚好和生成图片的point尺寸完全一致,图片和容器大小完全相等,自然不需要适配,scaleAspectFit看起来就像没生效。 - 自动布局配置冲突:你先给UIImageView设置了frame,随后又将
translatesAutoresizingMaskIntoConstraints设为false,此时原有frame会被系统忽略,你又没有给ImageView添加任何约束,最终ImageView的尺寸会直接和图片自身尺寸完全一致,同样不会触发内容适配逻辑。
修复方案
第一步:修改图片缩放方法
将生成图片上下文时的scale参数改为屏幕当前缩放倍率,不需要手动做像素/pt的转换:
public func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height var newSize: CGSize if(widthRatio > heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } let rect = CGRect(origin: .zero, size: newSize) // 第三个参数修改为屏幕scale UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale) image.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }
第二步:修改UI初始化逻辑
删除自动布局转换的关闭代码,保留原有frame配置即可:
let viewController = UIViewController() viewController.view.backgroundColor = .red var imageToShow:UIImage = self.arrayImages[cellIndex] let screenSize: CGRect = UIScreen.main.bounds // targetSize直接传pt尺寸即可,resize方法内部会处理scale适配 imageToShow = imageToShow.resizeImage(image: imageToShow, targetSize: screenSize.size)! let imageView = UIImageView.init(frame: CGRect(origin: .zero, size: imageToShow.size)) imageView.contentMode = .scaleAspectFit imageView.clipsToBounds = true imageView.image = imageToShow viewController.view = imageView // 删除这行无效配置 // imageView.translatesAutoresizingMaskIntoConstraints = false viewController.preferredContentSize = imageView.frame.size
修复后如果将imageView的尺寸调整为小于图片point尺寸,即可看到scaleAspectFit的适配效果。
内容的提问来源于stack exchange,提问作者ORStudios
相关产品推荐
相关产品推荐

