提问者:小点点

自动布局:UIImageView和Aspect Fit内容模式


我试图在父视图的中心放置一个< code>UIImageView。图像必须保持其原始的长宽比,也不应该超过父母的界限。因此,横向图像应该受到父图像宽度的限制,纵向图像应该在保持原始比例的情况下占据尽可能多的垂直空间。

对于AutoLayout来说,听起来似乎是一个非常简单的任务,对吗?以下是我对< code>UIImageView的设置:

  • 父级垂直居中
  • 在父级中水平居中
  • 图像视图.宽度

我还将< code>contentMode设置为< code>Aspect Fit。对于比设备屏幕小的小图像,一切都很好,但由于某种原因,我的< code>UIImageView比它的底层< code>UIImage占用了更多的空间用于大图像(注意绿色背景-< code > imageview . background color =[ui color green color])。

为什么会这样?我不是自动布局专家,我的约束在我看来是合理的。如果我使用200x400这样的较小图像,那么< code>UIImageView在屏幕上正好占据200x400个点,没有多余的绿色区域。

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


共2个答案

匿名用户

这是因为您将宽度和高度限制设置为

    < li >如果您确实知道宽高比,您可以将其设置为一个约束条件,您将看不到任何绿色背景。 < li >否则,请保持约束不变,并将背景色设置为透明色。这样,任何未被占用的区域都将是透明的,并且您设置的任何图像都将在至少一个维度上占据最大空间。

编辑:

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

@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()
}

匿名用户

尝试在Interface Builder Clip to Bound Image View中检查ImageView的“Clip to Bound”

你必须有一个明确的高度和宽度,而不是“