[英]How to make a square view resize with its superview using auto layout
在我的特定情况下,我在视图控制器中查看了我添加了以下约束:
现在视图位于视图控制器的上半部分。
在这里我添加了一个方形图像视图,为此我添加了以下约束:
我的约束似乎很完美,但是当在模拟器中运行时,我没有得到完美的正方形。 除此之外,在不同的模拟器屏幕上运行时,图像视图不会调整大小。
这是我的设置:
我查看了其他stackoverflow帖子,但似乎没有任何工作。
有一些基本步骤可以做到这一点吗?
编辑:
设置> = 10约束后:
编辑3:我添加了顶部,底部,前导,尾随约束2次,1次低于或等于(优先级1000),另一次大于或等于(优先级800),常数值为90.我不知道为什么底部它试图从主视图拉伸到90磅,而不是容器视图(绿色)。
您有一个视图需要扩展以填充其容器,同时保持其纵横比。 这是自动布局的常见模式。
诀窍是对前导/尾随/顶部/底部使用两个约束:
低优先级=10
>=10
所需的优先级。
把它们放在一起,你有:
宽高比1:1
Superview中心X / Y.
领先/尾随/上/下至Superview = 10(优先级为750)
前导/尾随/上/下至超级视图> = 10(优先级为1000)
UIImageView还需要考虑以下几点:
UIImageView将根据其显示的图像具有内在内容大小,因此您需要确保其内容拥抱优先级低于您用于=10
约束的750优先级。
UIImageView.contentMode
确定底层图像相对于UIImageView大小的大小。 默认情况下,它设置为UIViewContentModeScaleToFill
。
container view
----------------------------------------------
| | |
| >=10 |
| imageView | |
| ---------------------------- |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
|- >=10 -|---------- 1:1 -----------|- >=10 -|
| | | | |
| | | | |
| | | | |
| | | | |
| ---------------------------- |
| | |
| >=10 |
| | |
----------------------------------------------
**如果需要,您可以指定imageView的高度或宽度以及较低的优先级约束。
在代码中,对于realz。 注意:奇怪的CGFloat.greatestFiniteMagnitude
是必要的(或者一些更大的数字)以获得其他约束。 请享用。
extension UIView {
func constrainAsSquare(container: UIView, multiplier: CGFloat) {
translatesAutoresizingMaskIntoConstraints = false
centerXAnchor.constraint(equalTo: container.centerXAnchor).isActive = true
centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
widthAnchor.constraint(equalToConstant: .greatestFiniteMagnitude).activate(with: .defaultLow)
heightAnchor.constraint(lessThanOrEqualTo: container.heightAnchor, multiplier: multiplier).activate(with: .defaultHigh)
widthAnchor.constraint(lessThanOrEqualTo: container.widthAnchor, multiplier: multiplier).activate(with: .defaultHigh)
widthAnchor.constraint(equalTo: heightAnchor).activate(with: .required)
}
}
extension NSLayoutConstraint {
@discardableResult
func activate(with priority: UILayoutPriority) -> NSLayoutConstraint {
self.priority = priority
isActive = true
return self
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.