2

我试图根据是否使用自动布局单击按钮来隐藏和显示下图中的视图#1。有人知道怎么做吗?

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

任何意见,将不胜感激。我主要是在 IB 中尝试这样做,但也欢迎编程解决方案。

图片供参考:

查看测试

4

3 回答 3

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];
于 2013-11-30T00:10:41.527 回答
1

如果您愿意要求 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];
于 2016-06-03T23:00:35.137 回答
0

在这里回答Hide autolayout UIView : How to get existing NSLayoutConstraint to update this one

使用此类别https://github.com/damienromito/UIView-UpdateAutoLayoutConstraints

//Hide View 
[myView1 hideByHeight:YES];
于 2015-04-16T08:16:20.813 回答