我正在尝试以编程方式将按钮添加到已在视图中的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。这似乎不应该导致任何冲突,所以我在哪里关闭?
答案 0 :(得分:2)
你实际上正在犯两种你可以用约束做出的错误:你的约束 和不明确!通过将translatesAutoresizingMaskIntoConstraints
设置为NO来摆脱冲突,正如其他人所说的那样,但后来开始担心模棱两可。只有在指定布局所需的所有时,才能成功使用约束。你是指定顶部但是全部;你还需要指定前缘(左),也可能需要指定宽度和高度(可能不是因为按钮有时具有固有尺寸;你必须进行实验)。
答案 1 :(得分:1)
您获得的错误是因为您没有通过在子视图上调用setTranslatesAutoresizingMaskIntoConstraints:
来选择自动布局。
NSButton *pb = [[NSButton alloc] initWithFrame: bframe];
[pb setTranslatesAutoresizingMaskIntoConstraints:NO];