UIImageView保持宽高比,但适合宽度

时间:2015-09-23 22:41:00

标签: ios swift uiimageview uiimage aspect-ratio

我有一个固定宽度和高度的UIImageView。我不想改变UIImageView的框架。我想让它保持一个图像,我保持宽高比,我适应宽度,让图像太高,或者对于UIImageView的帧来说太短。像这样:

UIImageView frame

红色是UIImageView的框架。灰色是显示的实际图像。

3 个答案:

答案 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
}