我有一个固定宽度和高度的UIImageView。我不想改变UIImageView的框架。我想让它保持一个图像,我保持宽高比,我适应宽度,让图像太高,或者对于UIImageView的帧来说太短。像这样:
红色是UIImageView的框架。灰色是显示的实际图像。
答案 0 :(得分:20)
我认为最好的方法是使用你的imageView模式(Aspect Fill,Aspect Width,...这基于图像宽度和高度之间的比例
if image.width > image.height {
imageView.contentMode = UIViewContentModeScaleAspectFit
//since the width > height we may fit it and we'll have bands on top/bottom
} else {
imageView.contentMode = UIViewContentModeScaleAspectFill
//width < height we fill it until width is taken up and clipped on top/bottom
}
UIViewContentModeScaleAspectFit
通过维护内容来缩放内容以适合视图的大小 纵横比。视图边界的任何剩余区域都是透明的。
UIViewContentModeScaleAspectFill
缩放内容以填充视图的大小。部分的 可以剪裁内容以填充视图的边界。
还没有对它进行过测试,但出乎我的意思,这似乎是正确的
答案 1 :(得分:0)
我认为您需要将图像长宽比与UIImageView本身的长宽比进行比较:
private func updateUI() {
guard let image = image else { return }
let viewAspectRatio = self.bounds.width / self.bounds.height
let imageAspectRatio = image.size.width / image.size.height
if viewAspectRatio > imageAspectRatio {
self.contentMode = .scaleAspectFill
} else {
self.contentMode = .scaleAspectFit
}
}
override var image: UIImage? { didSet { updateUI() }}
override func layoutSubviews() {
super.layoutSubviews()
updateUI()
}
注意:这是宽高比宽度
答案 2 :(得分:0)
Swift 5.1 iOS 13
因为我的位置在集合视图的标题单元格上,所以这对我有用:
if headerCell!.imageView.frame.width > headerCell!.imageView.frame.height {
headerCell!.imageView.contentMode = .scaleAspectFit
//since the width > height we may fit it and we'll have bands on top/bottom
} else {
headerCell!.imageView.contentMode = .scaleAspectFill
//width < height we fill it until width is taken up and clipped on top/bottom
}