如何在运行时更改标签约束?

我有一个表格视图和一个单元格里面。 单元格包含三个标签:标题标签和两个彼此相对的标签。 有时,如果不包含数据,并且将“标题标签”的“顶部空间到容器”更改为“居中到容器”,则需要隐藏下面的两个标签。 当然,当两个标签包含数据时,还原约束条件。 下面是一个简单的演示项目的截图,只是为了展示这个想法:

在这里输入图像说明

更新 Max MacLeod答案指向正确的方向。 诀窍是在隐藏第一个和第二个标签时,将标题标签向下推。 因此,我们需要将底部空间设置为第一个和第二个标签的容器视图,而不是为标题标签的容器视图创build顶部空间。 通过高度出口(第一和第二标签的高度约束)并将它们的常数值设置为零(并且在取消隐藏时设置回值)来隐藏/取消隐藏。 我还将源代码示例上传到Github 。

select标题标签和其中一个较低的标签,并添加一个新的垂直空间约束,以反映它们之间的差距。 接下来,将标题标签Top space删除到容器约束。 也许你已经有了这个( 从屏幕上看不到 )。 如果你这样做,那很好。

现在,为每个较低的标签创build两个高度约束。 IBOutlet那些你的class级。

然后,通过将每个高度约束的constant0.f ,将隐藏这两个较低的标签。

这将使它们不可见,并降低上面的标题标签,使其现在在容器中垂直居中Y.

将再次通过步骤( 太长的评论! )。 顺序问题与IB作为首先,你必须添加一个新的约束,然后才能删除旧的。 暂时你会有一个多余的约束。 这是因为IB不允许歧义。 所以,首先添加新的垂直空间约束。 这将定义上标签的Y位置。 然后,从上面的标签删除多余的垂直空间到容器约束。 现在标签将被定位,使用相对于较低标签的垂直空间。 接下来,为每个较低标签添加高度约束,并使用IBOutlet链接到该类。 另一件事,实际上你将需要较低的标签被约束到底部空间约束的容器。 当它们的高度减小到零时,它们将消失,并且上面的标签将向下移动以呈现Y中心位置。

要恢复,只需将constant设置回原来的值。

这是比添加/删除约束更好的方法,这是一个重量级的操作。 请注意,您可能希望将两个较低的标签添加到“容器”视图,以便它们可以作为一个显示/隐藏。 此外,它会整理代码,因为你真的想要垂直空间在你的上面的标签,和两个较低的标签,而不是一个。

另请参阅我的回答AutoLayout与隐藏的UIViews?

将所有要隐藏的标签放入视图中,一旦所有东西都有正确的布局约束,将高度约束添加到容器视图,并将约束连接到IBOutlet属性。

确保你的属性是strong

在代码中哟只需将常量设置为0并激活它,隐藏内容,或停用它来显示内容。 这比用不变的价值来解决问题更好。 之后不要忘记调用layoutIfNeeded

 @property (strong, nonatomic) IBOutlet UIView *myContainer; @property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!! 

 -(void) showContainer { self.myContainerHeight.active = NO; self.myContainer.hidden = NO; [self.view layoutIfNeeded]; } -(void) hideContainer { self.myContainerHeight.active = YES; self.myContainerHeight.constant = 0.0f; self.myContainer.hidden = YES; [self.view layoutIfNeeded]; } 

一旦你有你的设置,你可以在IntefaceBuilder中testing它,通过设置你的约束为0,然后回到原来的价值。 不要忘记检查其他的约束优先事项,所以隐藏时根本不存在冲突。 其他testing方法是将其设置为0并将优先级设置为0,但是,您不应该忘记将其恢复到最高优先级。

我自己正在做这样的事情。 因此,为两个标签添加一个宽度约束。 您可以在应用约束条件时更改常量值 – 只要保留一个引用即可。 在我的情况下,我有一个数组,我把我打算改变的约束。

如果要隐藏标签,请将c值更改为0 – 您也可以在animation块中执行此操作。 显示更改值。

您还可以使顶部空间的宽度等于底部空间,所以当视图隐藏或显示时,您将项目的“组”保持居中。

请注意,您也可以添加或删除约束条件,但iOS处理的成本更高。

很less有人能够容易地理解,并且可以通过一些实际操作来举例说明什么是Apple文档,但是这是规则中例外的确切例子。

我个人发现这个文件很容易理解,而且很清楚。 成为自动布局大师的最佳方式:)

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html

基本上,运行时意味着“编程”。

所以你的问题的答案在这里:

https://stackoverflow.com/a/12623006/517119