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() }
尝试检查“ 剪辑到边界 ”的图像查看在界面生成器剪辑界限图像视图
你必须有一个明确的高度和宽度,而不是“<=”
- animationUIStackView排列的子视图内容大小更改
- UICollectionViewCell自动布局
- 如何在界面构build器中对视图进行约束来满足Xcode 8中的所有iphone屏幕
- 带iOS自动布局约束的UIScrollView:子视图的大小错误
- 自动布局具有dynamic高度子视图的UIScrollView
- 如何在animateTransition期间获取ToViewController中子视图的框架:?
- 如何使用自动布局在UIPageViewController中定位子视图?
- 居中使用NSLayoutConstraint大UIView
- Autolayout在iOS 8上工作正常,但在iOS 6和7(我使用XCode 6.2)上performance不佳,