Swift实现UIImageView根据所包含图片自动缩小适配
嘿,这个需求我之前也碰到过,其实利用UIImageView本身的特性就能轻松解决,分两种常用场景给你说清楚~
解决方案:根据图片尺寸自动调整UIImageView大小
场景1:手动代码布局(直接修改Frame)
如果你的UIImageView是通过手动设置frame来布局的,那设置图片后直接获取图片尺寸调整frame就行:
- 首先给UIImageView设置图片
- 获取图片的原始尺寸(注意如果图片是@2x/@3x的,UIImage的size已经是点尺寸,不用再除以缩放因子)
- 调整UIImageView的frame,这里以保持原中心位置为例:
// Swift 代码 let yourImage = UIImage(named: "your-image-name")! imageView.image = yourImage // 获取图片尺寸 let imageSize = yourImage.size // 调整frame,保持中心不变 imageView.frame = CGRect( x: imageView.center.x - imageSize.width / 2, y: imageView.center.y - imageSize.height / 2, width: imageSize.width, height: imageSize.height ) // 别忘了设置contentMode,保证图片正常显示 imageView.contentMode = .scaleAspectFit
对应的Objective-C代码:
// Objective-C 代码 UIImage *yourImage = [UIImage imageNamed:@"your-image-name"]; self.imageView.image = yourImage; CGSize imageSize = yourImage.size; CGRect newFrame = CGRectMake( self.imageView.center.x - imageSize.width / 2, self.imageView.center.y - imageSize.height / 2, imageSize.width, imageSize.height ); self.imageView.frame = newFrame; self.imageView.contentMode = UIViewContentModeScaleAspectFit;
场景2:Auto Layout布局(推荐,适配性更强)
如果用Auto Layout约束布局,核心是利用UIImageView的intrinsicContentSize——它默认就是图片的尺寸,所以只要不让父视图的约束强行拉伸它,就能自动适配图片大小:
简单实现(保持居中)
只给UIImageView添加居中约束,去掉和父视图边缘对齐的约束:
// Swift 代码 imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit // 添加居中约束 NSLayoutConstraint.activate([ imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor), imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor), // 可选:限制最大尺寸不超过父视图,避免图片过大撑出屏幕 imageView.widthAnchor.constraint(lessThanOrEqualTo: view.widthAnchor), imageView.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor) ]) // 设置图片后,UIImageView会自动调整到图片尺寸 imageView.image = yourImage
对应的Objective-C代码:
// Objective-C 代码 self.imageView.translatesAutoresizingMaskIntoConstraints = NO; self.imageView.contentMode = UIViewContentModeScaleAspectFit; [NSLayoutConstraint activateConstraints:@[ [self.imageView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor], [self.imageView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor], [self.imageView.widthAnchor constraintLessThanOrEqualToAnchor:self.view.widthAnchor], [self.imageView.heightAnchor constraintLessThanOrEqualToAnchor:self.view.heightAnchor] ]]; self.imageView.image = yourImage;
替换原有约束(如果之前已经加了边缘对齐约束)
如果你的UIImageView一开始是和父视图四边对齐的,那需要先移除这些约束,再添加尺寸和居中约束:
// Swift 代码 // 假设你已经保存了原来的边缘约束变量:leadingCon、trailingCon、topCon、bottomCon leadingCon.isActive = false trailingCon.isActive = false topCon.isActive = false bottomCon.isActive = false // 添加新的约束 if let image = yourImage { NSLayoutConstraint.activate([ imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor), imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor), imageView.widthAnchor.constraint(equalToConstant: image.size.width), imageView.heightAnchor.constraint(equalToConstant: image.size.height) ]) } imageView.contentMode = .scaleAspectFit
小提示
- 一定要设置
contentMode,推荐用.scaleAspectFit,这样图片会保持原始比例完整显示,不会被拉伸变形;如果想让图片填满UIImageView且不裁剪,可以用.scaleAspectFill(但记得设置clipsToBounds = true) - 如果图片是从网络加载的,要在图片加载完成后再执行调整尺寸的代码,不然获取到的size是零
内容的提问来源于stack exchange,提问作者Riccardo Perego
相关产品推荐
相关产品推荐

