1

我正在尝试以编程方式将按钮添加到已经在视图中的 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。看起来这应该不会引起任何冲突,那么我在哪里呢?

4

2 回答 2

2

实际上,您在使用约束时会犯两种错误:您的约束冲突模棱两可!正如其他人所说,通过设置为 NO 来消除冲突translatesAutoresizingMaskIntoConstraints,但随后开始担心歧义。只有指定布局所需的所有内容,才能成功使用约束。您正在指定顶部,但仅此而已;您还需要指定前缘(左),可能还需要指定宽度和高度(可能不是因为按钮有时具有固有大小;您必须进行试验)。

于 2013-04-06T00:41:41.970 回答
1

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

NSButton *pb = [[NSButton alloc] initWithFrame: bframe];
[pb setTranslatesAutoresizingMaskIntoConstraints:NO];
于 2013-04-06T00:26:58.410 回答