我有一些麻烦NSLayoutConstraint
。
如果我尝试constant
使用该setConstant:
方法进行更改,NSLayoutConstraint 会给我一个例外。当我通过代码添加高度约束时,我只有这个问题。
首先,我得到这样的高度约束:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
这给了我正确的约束。我有一个 NSTextField 子类,它可以完美地工作。约束在 Interface Builder 中设置,我可以设置和更改常量。
现在我有了一个视图,在其中我在运行时添加了不同的子视图。这些子视图位于自己的 NIB 中,这意味着我无法固定它们的宽度和高度。所以我想我会在视图被添加到超级视图后立即添加约束。这是正在执行的viewDidMoveToSuperview
。
// Pin Width & Height
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.width]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.height]];
添加了约束,我可以通过 NSLog 确认这一点。
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
现在,最后,当我尝试使用更改约束时,[constraint setConstant:somethingDifferent];
出现以下异常:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10053ff10 h=--& v=&-- V:[ITControlPanelChildView:0x10192e4f0(317)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>
这正是我想要改变的约束。谁能向我解释为什么会这样?
编辑
我刚刚读到NSAutoresizingMaskLayoutConstraint
s 是自动添加的,如果您设置[self setTranslatesAutoresizingMaskIntoConstraints:NO];
.
如果我禁用它,它可以工作。
如果我可以访问创建的内容,那就更好NSAutoresizingMaskLayoutConstraint
了。有谁知道这是如何工作的?