垂直自动拉出两个视图,动态高度对齐顶部

时间:2013-11-22 11:25:53

标签: ios swift autolayout

我有两个可以是动态高度的视图。 取决于内容,view1或view2是最高的。

最高视图应确定到view3的距离。

在我当前的实现中,view1和view2对view3的x像素都有约束。但问题是view1和view2然后总是相同的高度(所有内容都不会对齐顶部)

5 个答案:

答案 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)

实际上有两种方法

  1. 有约束条件(如rdelmar所述)
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来找出它

  1. 使用StackViews
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;