Objective c NSLayoutConstraints冲突
我试图以编程方式将按钮添加到视图中已存在的NSTextField下面的视图中。视图是在IB中创建的,并使用约束。这是一个NSTableCellView,但我怀疑这在这个案例中有什么区别。因此,我的代码是:Objective c NSLayoutConstraints冲突,objective-c,nsview,nslayoutconstraint,Objective C,Nsview,Nslayoutconstraint,我试图以编程方式将按钮添加到视图中已存在的NSTextField下面的视图中。视图是在IB中创建的,并使用约束。这是一个NSTableCellView,但我怀疑这在这个案例中有什么区别。因此,我的代码是: NSView *previousView = self.pathsField; for( NSString *path in self.revision.paths ) { NSButton *pb = [[NSButton alloc] initWithFrame: bframe]
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。这似乎不应该导致任何冲突,那么我该从哪里开始呢?您收到的错误是因为您没有通过在子视图上调用
settranslatesAutoResistingGMaskintoConstraints:
来选择autolayout
NSButton *pb = [[NSButton alloc] initWithFrame: bframe];
[pb setTranslatesAutoresizingMaskIntoConstraints:NO];
实际上,您在约束方面犯了两种可能犯的错误:您的约束既冲突又不明确!正如其他人所说,通过将
translatesAutoresizingMaskIntoConstraints
设置为“否”来消除冲突,然后开始担心歧义。只有指定布局所需的所有内容,才能成功使用约束。您正在指定顶部,但仅此而已;您还需要指定前缘(左侧),可能还需要指定宽度和高度(可能不是因为按钮有时具有固有的大小;您必须进行实验)。右上!谢谢你的帮助。TranslatesAutoResizengMask是缺少的一位。之后,让布局正常运行就很简单了。一定要检查是否存在歧义!最好的方法是:暂停调试器,在调试器控制台的命令行中说po[[UIWindow keyWindow]\u autolayoutTrace]
。此外,由于您也是@Matt,我觉得我可以在Matt之间向您指出,您不接受(单击问题答案之一旁边的复选框)。我不是说你应该接受我的答案(另一个答案是正确的,而且是第一个);我只是说,如果你这样做,人们会更倾向于帮助你,因为这是他们帮助你的最大动机之一。