NSLayoutConstraint IBOutlet不响应setActive:

时间:2016-02-24 22:36:57

标签: ios objective-c uiviewcontroller autolayout constraints

我有UIViewController,我想根据点击按钮动态修改部分布局。

作为简化示例,假设我在IB(self.box)中创建了UIView。在IB中,设置一个约束,使视图的宽度等于VC视图宽度的0.9。

然后我以编程方式添加另一个约束并将其另存为强属性。它将视图的宽度设置为VC视图宽度的0.7,并删除先前的约束。

这会导致相互矛盾的约束错误和完全破坏的视图。无论我是先添加还是删除,还是使用.active属性而不是添加/删除,都会发生同样的情况。

有关如何使这项工作的任何想法?我的实际案例比较复杂,但我已经检查过,只修改了UIViewController中视图的宽度约束导致错误,即使将其设置为IB中的不同乘数也不会导致任何冲突。

- (void) viewDidLoad
{
    NSLayoutConstraint* lowWidth = [NSLayoutConstraint constraintWithItem:self.box attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.7 constant:0.f];
    self.lowWidth = lowWidth;

    [self.view removeConstraint:self.highWidth];
    [self.view addConstraint:self.lowWidth];
}

约束冲突包括以下内容:

Probably at least one of the constraints in the following list is one you don't want. 
Try this:
<NSLayoutConstraint:0x145efb0f0 UIView:0x145d8d330.width == 0.7*UIView:0x14755e890.width>,
<NSLayoutConstraint:0x1474589b0 UIView:0x145d8d330.width == 0.9*UIView:0x14755e890.width>

编辑:在我的IBOutlet约束上调用setActive:似乎没有用,所以我删除了插座并以编程方式创建了约束。这次它按预期工作,但我没有解释为什么插座不起作用。请注意,设置为弱/强不会改变任何内容。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *highWidth;

1 个答案:

答案 0 :(得分:0)

我只使用一个NSLayoutConstraint并修改约束大小。

self.highWidth?.contant = size
[self.view layoutIfNeeded]

或激活/停用约束... NSLayoutConstraint class