在我的特定情况下,我在视图控制器中查看了我添加了以下约束:
现在视图位于视图控制器的上半部分。
在此我添加了一个方形图像视图,为此我添加了以下约束:
我的约束似乎很完美,但在模拟器中运行时,我不会得到一个完美的方块。除此之外,在不同的模拟器屏幕上运行时,图像视图不会调整大小。
这是我的设置:
我查看了其他stackoverflow帖子,但似乎没有任何效果。
是否有一些基本步骤可以做到这一点?
编辑:
设置> = 10个约束后:
编辑3:我添加了顶部,底部,前导,尾随约束2次,1次低于或等于(优先级1000),另一次大于或等于(优先级800),常数值为90.我不知道为什么底部试图从主视图拉伸到90磅,而不是容器视图(绿色)。
答案 0 :(得分:18)
您有一个视图需要扩展以填充其容器,同时保持其宽高比。这是自动布局的常见模式。
诀窍是对前导/尾随/顶部/底部使用两个约束:
=10
优先次序
>=10
所需优先级。
总而言之,你有:
宽高比1:1
Superview中心X / Y
领先/尾随/上/下到Superview = 10(优先级为750)
领先/尾随/上/下至超级视图> = 10(优先级为1000)
UIImageView还需要考虑几件事:
UIImageView将根据其显示的图像具有内在内容大小,因此您需要确保其内容拥抱优先级低于您用于=10
约束的750优先级
UIImageView.contentMode
确定底层图像相对于UIImageView大小的大小。默认情况下,它设置为UIViewContentModeScaleToFill
。
答案 1 :(得分:2)
container view
----------------------------------------------
| | |
| >=10 |
| imageView | |
| ---------------------------- |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
|- >=10 -|---------- 1:1 -----------|- >=10 -|
| | | | |
| | | | |
| | | | |
| | | | |
| ---------------------------- |
| | |
| >=10 |
| | |
----------------------------------------------
**如果您需要,您可以指定imageView的高度或宽度以及较低的优先级约束。
答案 2 :(得分:2)
我成功使用此配置。
答案 3 :(得分:0)
在代码中,用于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
}
}