激活/停用自动布局NSLayoutConstraints

时间:2016-08-22 09:33:43

标签: ios objective-c xcode autolayout nslayoutconstraint

我有一个UIScrollView,其中有一个UIView,它定义了ScrollView的ContentSize。 在ContentView中,我有几个不同的视图,它们都具有相等的宽度(最大宽度),并且都具有与Superview成比例的高度(甚至高于UIScrollView)。 设置完美,滚动工作。

现在,如果内部没有要显示的内容,我希望能够隐藏其中一个UIViews,并且这样做,我希望其他视图调整自己以填充留下的空白区域。

我对Superview的特定UIView有一个高度约束,乘数为0.3 我添加了第二个高度约束,完全相同的UIView到完全相同的Superview,乘数为0.01,但优先级较低,因此它不会在运行时影响它。 (我已经测试了这种情况:如果我将0.3乘数放在较低优先级上,将0.01乘数放在较高优先级上,则所有内容都会完全调整大小,完全符合我的要求。)

现在我在头文件中创建了两个带连接的插座,这是我想要进行更改时使用的代码:

//DescriptionViewNormalConstraint is the 0.3 height one, with 1000 priority
        descriptionViewNormalConstraint.active = NO;
//DescriptionViewInvisibleConstraint is the 0.01 height one, with 500 priority
        descriptionViewInvisibleConstraint.active = YES;
        [self.view setNeedsLayout];
        [self.view layoutIfNeeded];

但这不起作用。事实上,它什么都没改变。 我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

解决方案是我必须改变两个约束的优先级。 将默认情况下要使用的约束设置为低于1000的任何优先级。例如,750。 将另一个约束的优先级设置为250.(在故事板中)。

一旦你想要第二个约束来替换第一个约束,只需将第二个约束的优先级从250改为任何高于750的任何约束,它就会神奇地起作用。

答案 1 :(得分:0)

如果您在停用后不需要重新激活descriptionViewNormalConstraint,那么您可以使用以下代码从应用的视图中删除该约束

[myCustomView removeConstraint:descriptionViewNormalConstraint]; 

然后刷新。让我知道它是否有效