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() }
尝试检查“ 剪辑到边界 ”的图像查看在界面生成器剪辑界限图像视图
你必须有一个明确的高度和宽度,而不是“<=”
- UISplitViewController – 设置始终可见的主控制器
- 使用自动布局,如何使UIImageView的大小dynamic取决于图像?
- iOS滚动视图,容器视图 – 自动布局问题
- 在tableHeaderView中使用自动布局
- UICollectionViewCell systemLayoutSizeFittingSize返回不正确的宽度
- UIImageView / UIView的Autolayout宽高比
- 如何以编程方式在UIScrollView中用AutoLayout设置子视图?
- 如何使用自动布局在UIPageViewController中定位子视图?
- 使用自动布局pipe理UITextField的dynamic位置