AutoLayout:UIImageView和Aspect Fit内容模式

我试图把UIImageView放在父视图的中心。 图片必须保持原有的宽高比,也不能超过父母的界限。 所以风景图像应该受父母的宽度限制,肖像图像应该保持原始比例所需的垂直空间。

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

  • 父母垂直居中
  • 在父母水平居中
  • imageView.width <= superview.width
  • imageView.height <= superview.height

我还将contentMode设置为Aspect Fit 。 对于小于设备屏幕的小图像,一切工作真的很好,但由于某种原因,我的UIImageView比大型图像的底层UIImage占用更多的空间(注意绿色背景 – imageView.backgroundColor = [UIColor greenColor] )。

在这里输入图像说明

为什么发生这种情况? 我不是一个AutoLayout专家,因为我的约束看起来很合理。 如果我使用像200×400这样的小图像,那么UIImageView在屏幕上显示200×400点,没有额外的绿色区域。

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

这是发生,因为你已经设置宽度和高度约束为<=。 对于小图像,imageView的框架计算没有任何问题,所有的约束都满足。 但是,当设置一个大的图像,imageView的大小将被设置,使图像适合,但同样受限于超视图的大小(屏幕大小)。

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

编辑:

可能不是最好的解决scheme,老式的学校。 您可以添加严格的宽度和高度约束,并使用图像的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() } 

尝试检查“ 剪辑到边界 ”的图像查看在界面生成器剪辑界限图像视图

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