我有两个可以是动态高度的视图。 取决于内容,view1或view2是最高的。
最高视图应确定到view3的距离。
在我当前的实现中,view1和view2对view3的x像素都有约束。但问题是view1和view2然后总是相同的高度(所有内容都不会对齐顶部)
答案 0 :(得分:8)
试试这个。确保视图1和2都有一些约束到超视图的顶部和侧面(或固定宽度,无论在水平方向上修复视图所需的任何内容)。假设您希望底部视图的距离为30.为视图1提供一个约束,以查看优先级为200的= 30的另一个,以及优先级为1000的另一个> = 30(默认值)。视图2应该只需要一个约束来查看具有1000优先级的> = 30的3。
低优先级约束(200)将最初修复视图3的位置,但是足够低以至于如果视图2扩展,视图3将向下移动,并且还足够低以使视图1的默认内容拥抱优先级将如果它不需要基于文本大小,请不要扩展它的高度。
答案 1 :(得分:0)
接受的答案对我不起作用(虽然它确实让我走上了正确的道路)。在我的例子中,视图1或视图2可以是任何大小,视图3必须低于最高大小。这段代码使它工作,但我必须说我发现autolayout非常不直观:
let view3TopAnchor1 = statusL.topAnchor.constraint(greaterThanOrEqualTo: view1.bottomAnchor, constant: 10.0)
view3TopAnchor1.priority = UILayoutPriority(100)
view3TopAnchor1.isActive = true
let view3TopAnchor2 = statusL.topAnchor.constraint(greaterThanOrEqualTo: view2.bottomAnchor, constant: 10.0)
view3TopAnchor2.priority = UILayoutPriority(100)
view3TopAnchor2.isActive = true
view1.setContentHuggingPriority(UILayoutPriority(101), for: .vertical)
view2.setContentHuggingPriority(UILayoutPriority(101), for: .vertical)
答案 2 :(得分:0)
迅速
import SnapKit
view3.snp.makeConstraints {
$0.top.greaterThanOrEqualTo(view1.snp.bottom).offset(30)
$0.top.greaterThanOrEqualTo(view2.snp.bottom).offset(30)
$0.left.right.equalTo(0)
$0.height.equalTo(50)
}
答案 3 :(得分:0)
实际上有两种方法
class MyViewController: ViewController {
let view1 = View()
let view2 = View()
let view3 = View()
override func buildUI() {
super.buildUI()
body {
view1
.edgesToSuperview(top: 16, leading: 16)
view2
.edgesToSuperview(top: 16, trailing: -16)
.width(to: view1)
.leadingTo(view1, 16)
view3
.topTo(view1, 30 ! 200) // 200 is priority, ! is priority operator
.topTo(view2, >=30)
.edgesToSuperview(leading: 16, trailing: -16, bottom: -16)
}
}
}
我不确定这里的= 30优先级是否为200,也许与view2一样应该为> = 30,但是您可以轻松地用Live preview来找出它
class MyViewController: ViewController {
override func buildUI() {
super.buildUI()
body {
VStack {
HStack {
View() // view 1
View() // view 2
}
.distribution(.fillEqually) // to make view 1&2 width equally
.alignment(.top)
Space() // flexible space
VSpace(30) // fixed 30pt height space
View() // view 3
}
.edgesToSuperview()
}
}
}
所有示例都是使用很棒的UIKitPlus库
答案 4 :(得分:-1)
float yPos = MAX(view1.frame.size.height,view2.frame.size.height);
view3.frame.origin.y = view1.frame.origin.y + maxHeight;