根据最大的子视图,使用autolayout调整superview的大小

时间:2015-07-14 07:41:16

标签: swift cocoa autolayout nsview nslayoutconstraint

如果我们的内部NSView列具有动态高度,则使用autolayout调整superview大小的最佳做法是什么?

例如。如果我们有两个列布局,其中左列高度大于右列,则超视图高度应为右列高度。比如,如果我们将右栏高度改为大于左栏高,则超视高度应改为右栏的高度。如何做到这一点?

我制作了示例项目来测试这个:

  1. 最初我们的布局有两列,其中左.Bottom的{​​{1}}约束附加到superview的底部。
  2. Initial state

    1. 如果我们按NSView按钮,我的右侧Make Right Bigger的高度比左侧的高。
    2. Final state

      所以我想在这里使用superview根据较大的列(右列)更改高度。这样做有好的做法吗?

      代码:

      NSView

      下载测试项目:GitHub

2 个答案:

答案 0 :(得分:2)

管理只使用约束来完成此操作。只需为列添加容器视图,并将其高度设置为GreaterThanOrEqual到左列和右列。

view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Height, relatedBy: .GreaterThanOrEqual, toItem: leftView, attribute: .Height, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Height, relatedBy: .GreaterThanOrEqual, toItem: rightView, attribute: .Height, multiplier: 1, constant: 0))

答案 1 :(得分:0)

首先在高度为

的superview上创建一个约束
let heightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: greaterHeightAmongTwoColumns)

如评论中所述,您可以发布通知,然后让超级视图知道更新的帧。超级视图将检查两列中任何一列的更新高度是否大于其当前高度并更新上面声明的heightConstraint然后调用

[self layoutIfNeeded] 

在superview的superview上,以便用新框架进行布局。