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 自动布局问题

iOS 自动布局过程

ios 6自动布局约束错误

不同设备尺寸的 iOS 自动布局约束值

iOS底部对齐具有编程自动布局约束的对象

转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束