如何在UIImageView中缩小图片并保持比例?解决scale只读报错
在UIImageView中按比例缩小图片的正确方法
你遇到的报错是因为UIImage的scale属性是只读的,它用于标识图片的像素密度(比如@2x、@3x资源对应的scale值),并非用来调整图片的显示或像素尺寸,所以直接赋值会触发错误。
以下是几种实现按比例缩小图片的可行方案:
方案1:调整UIImageView尺寸 + 设置ContentMode(推荐)
这是最简单高效的方式,通过修改UIImageView的大小,配合contentMode确保图片按比例适配:
// 获取原图尺寸(如果ImageView已有图片) guard let originalImageSize = cameraPhoto.image?.size else { return } // 计算缩小50%后的尺寸(保持原比例) let scaledSize = CGSize(width: originalImageSize.width * 0.5, height: originalImageSize.height * 0.5) // 更新ImageView的尺寸(这里用bounds示例,你也可以用Auto Layout约束) cameraPhoto.bounds = CGRect(origin: cameraPhoto.bounds.origin, size: scaledSize) // 设置ContentMode,确保图片按比例适配ImageView cameraPhoto.contentMode = .scaleAspectFit
如果希望图片填充整个ImageView(可能裁剪部分区域),可以将contentMode改为.scaleAspectFill,同时设置clipsToBounds = true。
方案2:重新生成缩小后的UIImage
如果需要修改图片本身的像素尺寸(比如降低内存占用),可以通过Core Graphics绘制新的缩小图片:
func scaledImage(with image: UIImage, scaleFactor: CGFloat) -> UIImage? { let targetSize = CGSize(width: image.size.width * scaleFactor, height: image.size.height * scaleFactor) // 开启绘图上下文,保持原图片的scale属性 UIGraphicsBeginImageContextWithOptions(targetSize, false, image.scale) image.draw(in: CGRect(origin: .zero, size: targetSize)) let scaledImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return scaledImage } // 使用示例 if let originalImage = cameraPhoto.image { cameraPhoto.image = scaledImage(with: originalImage, scaleFactor: 0.5) cameraPhoto.contentMode = .scaleAspectFit }
方案3:通过Transform缩放UIImageView
如果只是临时缩放显示(不修改ImageView尺寸或图片本身),可以使用仿射变换:
// 缩小到原大小的50% cameraPhoto.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) // 如果需要保持ImageView的位置不变,可以调整center属性 // cameraPhoto.center = CGPoint(x: originalCenterX, y: originalCenterY)
内容的提问来源于stack exchange,提问作者user19534819
相关产品推荐
相关产品推荐

