使用Cocoa自动布局隐藏和显示视图

时间:2013-11-21 16:30:24

标签: macos cocoa autolayout nsstackview

我正在尝试隐藏并显示以下图片中的视图#1,具体取决于是否使用Autolayout单击了按钮。有谁知道怎么做?

我尝试为视图#2设置两个NSLayoutConstraints,一个绑定到视图#1和视图#2的超级视图的顶部,另一个绑定到视图#1的底部,然后更改NSLayoutConstraints的优先级隐藏视图#1,但似乎没有做任何事情。

任何建议都将不胜感激。我主要是尝试在IB中这样做,但也欢迎程序化解决方案。

Pic供参考:

View test

3 个答案:

答案 0 :(得分:2)

NSStackView在这里是合适的。它自动创建约束,使其子视图在堆栈中相互关联。

隐藏视图不会改变布局。它仍在那里,只是没画画。

如果你在没有NSStackView的情况下这样做,你会做的是改变约束。保留一个实例变量_stackConstraints。在一种配置中,堆栈约束将是

V:|-[0]-[view1(v1Height)]-0-[view2]-0-[view3(v3Height)]-0-|

和其他配置

V:|-[0]-[view2]-0-[view3(v3Height)]-0-| 

按下按钮时,请执行

[[self view] removeConstraints:_stackConstraints];
_stackConstraints = <make other set of constraints>
[[self view] addConstraints:_stackConstraints];

答案 1 :(得分:1)

如果您愿意要求10.11+,您只需选择&#34;分离隐藏视图&#34;在Interface Builder中的NSStackView上(或以编程方式设置detachesHiddenViews = YES)。

然后将View#1设置为hidden = YES将自动重新布局堆栈视图,使View#2占用更多空间(假设堆栈视图高度是固定的 - 如果不是,堆栈视图会变得更少)高而不是。

如果您需要支持10.10或更早版本,则可以通过以下方式隐藏视图:

[stackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible forView:view1];

再次通过以下方式显示:

[stackView setVisibilityPriority:NSStackViewVisibilityPriorityMustHold forView:view1];

答案 2 :(得分:0)