iOS 自动布局约束刷新
Posted
技术标签:
【中文标题】iOS 自动布局约束刷新【英文标题】:iOS autolayout constraints refresh 【发布时间】:2013-06-20 12:12:33 【问题描述】:主要问题:我有三个标签(label1、label2、label3),一个在另一个之下。 如果在运行时将 label2 设置为隐藏或从 superview 中删除,我如何将 label3 对齐到 label1 下方。
初始视图:
Label1
vertical spacing
Label2
vertical spacing
Label3
行动:
set Label2.hidden = yes;
输出:
Label1
vertical spacing
Label3
我尝试的是应用垂直间距约束:
-
label1 和 label2 之间有一定的优先级
在 label2 和 label3 之间,对第三个约束具有高优先级
在 label1 和 label3 之间,优先级最低
现在,当我删除 label2 时,如何刷新约束,或者我应该跟踪所有约束并在 label2 隐藏时删除第二个约束?
【问题讨论】:
【参考方案1】:一种解决方案是更改 label2 上的高度约束使其为零,然后刷新约束以使所有内容都向上移动。您必须为该变量创建一个属性并使用+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
进行设置
几个提示:
确保从 标签,而不是标签的超级视图。 您可以使用所有相同的值 对于新约束的现有约束,当然, 常量 0 除外。祝你好运!
【讨论】:
这有一种方法可以让我在开始时设置所有约束,比如 android 中的线性布局,如果你隐藏中间视图,其他视图将在其他视图下方对齐.. 我不能说你可以在 Android 中做什么,但要让中间视图消失然后让第三个视图向上移动,你应该能够按照我在回答。【参考方案2】:为什么不把 label3 的 frame 设置为 hidden 就等于 label2 呢?
所以在Label2.hidden = YES;
之后添加Label3.frame = Label2.frame;
,反之亦然。
【讨论】:
只是想利用 layoutcontraintrs 功能,因为它将主要在 ios 7 中使用 设置框架在约束生效时被忽略以上是关于iOS 自动布局约束刷新的主要内容,如果未能解决你的问题,请参考以下文章
转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束