AutoLayout:UIImageView和Aspect Fit内容模式

时间:2016-10-19 22:29:27

标签: ios uiimageview autolayout ios-autolayout

我试图在父视图的中心放置UIImageView。图像必须保持其原始宽高比,并且它不应超过父母的界限。因此,景观图像应受父母宽度的限制,肖像图像应占据所需的垂直空间,保持原始比例。

对于AutoLayout来说,这听起来很简单,对吧?这是UIImageView的设置:

  • 在父母的垂直居中
  • 在父级中居中居中
  • imageView.width< = superview.width
  • imageView.height< = superview.height

我还将contentMode设置为Aspect Fit。对于小于设备屏幕的小图片,一切都非常有用,但由于某些原因,我的UIImageView比大图像的UIImage占用更多空间(请注意绿色背景 - imageView.backgroundColor = [UIColor greenColor])。

enter image description here

为什么会这样?我不是一个AutoLayout专家,我的约束对我来说是合理的。如果我使用像200x400这样的较小图像,那么UIImageView在屏幕上只需要200x400点就没有额外的绿色区域。

我想添加边框和圆角,在这种情况下显然无法正常工作。

2 个答案:

答案 0 :(得分:2)

这是因为您将宽度和高度约束设置为< =。 对于小图像,imageView的帧计算没有任何问题,并且满足所有约束。但是当设置一个大图像时,将设置imageView的大小以使图像适合,但同时它受到超视图(屏幕大小)大小的限制。

  • 如果您确定知道纵横比,可以将其设置为约束条件 你不会看到任何绿色背景。
  • 否则就离开你 它们是约束,并设置背景颜色以清除颜色。这个 任何未占用的区域将是透明的,您设置的任何图像 将在至少一个维度上占用最大空间。

修改

可能不是最好的解决方案,有点老了。您可以添加严格的宽度和高度约束,并使用image的aspectRatio手动计算它们:

@IBOutlet weak var heightConstraint: NSLayoutConstraint!
@IBOutlet weak var widthConstraint: NSLayoutConstraint!

func setImage(image: UIImage) {
    imageView.image = image
    let screenSize = UIScreen.main.bounds.size

    let imageAspectRatio = image.size.width / image.size.height
    let screenAspectRatio = screenSize.width / screenSize.height

    if imageAspectRatio > screenAspectRatio {
        widthConstraint.constant = min(image.size.width, screenSize.width)
        heightConstraint.constant = widthConstraint.constant / imageAspectRatio
    }
    else {
        heightConstraint.constant = min(image.size.height, screenSize.height)
        widthConstraint.constant = heightConstraint.constant * imageAspectRatio
    }
    view.layoutIfNeeded()
}

答案 1 :(得分:0)

尝试在Interface Builder中检查imageView的“ Clip to Bounds Clip to Bounds Image View

并且您必须具有明确定义的高度和宽度,而不是“< =”