NSLayoutConstraints冲突

时间:2013-04-05 22:36:15

标签: objective-c nsview nslayoutconstraint

我正在尝试以编程方式将按钮添加到已在视图中的NSTextField下方的视图中。视图在IB中创建并使用约束。它是一个NSTableCellView,但我怀疑在这种情况下有什么不同。因此我的代码是:

NSView *previousView = self.pathsField;

for( NSString *path in self.revision.paths )
{
    NSButton *pb = [[NSButton alloc] initWithFrame: bframe];

    pb.bezelStyle = NSRoundRectBezelStyle;
    [self addSubview: pb];
    pb.title = path;
    [self addConstraint: [NSLayoutConstraint constraintWithItem: pb
                                           attribute: NSLayoutAttributeTop
                                           relatedBy: NSLayoutRelationEqual
                                           toItem: previousView
                                           attribute: NSLayoutAttributeBottom
                                           multiplier: 1 constant: 2.0]];
    [buttons addObject: pb];
    bframe.origin.y += 20;
    previousView = pb;
}
self.pathButtons = buttons;

如果我调用addConstraint,按钮会添加没有投诉(只是不在正确的位置)。通过addConstraint调用,我在调试控制台上获得了很多关于约束冲突的消息,并且我的一些IB创建的约束被破坏了。

显然我做错了什么。我希望约束要求新按钮的顶部比上一个视图或按钮的底部低2 px。这似乎不应该导致任何冲突,所以我在哪里关闭?

2 个答案:

答案 0 :(得分:2)

你实际上正在犯两种你可以用约束做出​​的错误:你的约束 不明确!通过将translatesAutoresizingMaskIntoConstraints设置为NO来摆脱冲突,正如其他人所说的那样,但后来开始担心模棱两可。只有在指定布局所需的所有时,才能成功使用约束。你是指定顶部但是全部;你还需要指定前缘(左),也可能需要指定宽度和高度(可能不是因为按钮有时具有固有尺寸;你必须进行实验)。

答案 1 :(得分:1)

您获得的错误是因为您没有通过在子视图上调用setTranslatesAutoresizingMaskIntoConstraints:来选择自动布局。

NSButton *pb = [[NSButton alloc] initWithFrame: bframe];
[pb setTranslatesAutoresizingMaskIntoConstraints:NO];