我试图根据是否使用自动布局单击按钮来隐藏和显示下图中的视图#1。有人知道怎么做吗?
我尝试为视图 #2 设置两个 NSLayoutConstraints,一个绑定到视图 #1 和视图 #2 的超级视图顶部,一个绑定到视图 #1 的底部,然后更改NSLayoutConstraints 隐藏视图#1,但这似乎没有做任何事情。
任何意见,将不胜感激。我主要是在 IB 中尝试这样做,但也欢迎编程解决方案。
图片供参考:
我试图根据是否使用自动布局单击按钮来隐藏和显示下图中的视图#1。有人知道怎么做吗?
我尝试为视图 #2 设置两个 NSLayoutConstraints,一个绑定到视图 #1 和视图 #2 的超级视图顶部,一个绑定到视图 #1 的底部,然后更改NSLayoutConstraints 隐藏视图#1,但这似乎没有做任何事情。
任何意见,将不胜感激。我主要是在 IB 中尝试这样做,但也欢迎编程解决方案。
图片供参考:
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];
如果您愿意要求 10.11+,您可以在 Interface Builder 的 NSStackView 上选择“Detaches Hidden Views”(或detachesHiddenViews = YES
以编程方式设置)。
然后将 View #1 设置为hidden = YES
将自动重新布局堆栈视图,使 View #2 占用更多空间(假设堆栈视图高度是固定的——如果不是,堆栈视图只会变得不那么高)。
如果您需要支持 10.10 或更早版本,则可以这样隐藏视图:
[stackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible forView:view1];
并通过以下方式再次显示:
[stackView setVisibilityPriority:NSStackViewVisibilityPriorityMustHold forView:view1];
在这里回答Hide autolayout UIView : How to get existing NSLayoutConstraint to update this one
使用此类别https://github.com/damienromito/UIView-UpdateAutoLayoutConstraints
//Hide View
[myView1 hideByHeight:YES];