我正在尝试隐藏并显示以下图片中的视图#1,具体取决于是否使用Autolayout单击了按钮。有谁知道怎么做?
我尝试为视图#2设置两个NSLayoutConstraints,一个绑定到视图#1和视图#2的超级视图的顶部,另一个绑定到视图#1的底部,然后更改NSLayoutConstraints的优先级隐藏视图#1,但似乎没有做任何事情。
任何建议都将不胜感激。我主要是尝试在IB中这样做,但也欢迎程序化解决方案。
Pic供参考:
答案 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)
在这里回答Hide autolayout UIView : How to get existing NSLayoutConstraint to update this one
使用此类别https://github.com/damienromito/UIView-UpdateAutoLayoutConstraints
//Hide View
[myView1 hideByHeight:YES];