繁体   English   中英

UIImageView 保持纵横比,但适合宽度

[英]UIImageView keep aspect ratio, but fit to width

我有一个固定宽度和高度的 UIImageView。 我不想改变 UIImageView 的框架。 我想让它保存一个图像,在那里我保持纵横比,我适合宽度,让图像对于 UIImageView 的框架来说要么太高,要么太短。 像这样:

UIImageView 框架

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

我认为最好的方法是使用 imageView 的模式(纵横比填充、纵横宽等),这是基于图像的宽度和高度之间的比率

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

缩放内容以填充视图的大小。 内容的某些部分可能会被裁剪以填充视图的边界。

我还没有测试过,但我觉得这似乎是对的

我认为您需要将图像纵横比与 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()
}

注意:这是方面适合宽度

斯威夫特 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
}

对于我的情况下的解决办法是设置UIImageViewcontentMode基于如果图像的高度和宽度的比率大于的更大imageView的。

func setupImageViewContentMode() {
    if let image = imageView.image, image.size.height / image.size.width > imageView.frame.height / imageView.frame.width {
        imageView.contentMode = .scaleAspectFit
    } else {
        imageView.contentMode = .scaleAspectFill
    }
}

另外,请注意,您必须根据当前布局进行设置,因此在从后端或任何您需要的地方加载图像后,例如在layoutSubviews()viewDidLayoutSubviews()调用此方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM