我試圖通過編程方式將按鈕添加到已經在視圖中的NSTextField下方的視圖。該視圖是在IB中創建的並使用約束。這是一個NSTableCellView,但我懷疑這種情況有什麼不同。我的代碼是這樣的:NSLayoutConstraints衝突
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。它似乎不應該導致任何衝突,所以我在哪裏?
對!謝謝您的幫助。 translatesAutoResizingMask是缺失的位。之後,讓佈局行爲變得很簡單。 – Matt 2013-04-06 17:28:41
一定要檢查模棱兩可!最好的方法是:在調試器中暫停,並在調試器控制檯的命令行中說'po [[UIWindow keyWindow] _autolayoutTrace]'。 – matt 2013-04-06 17:58:28
另外,既然您也是@Matt,我覺得我可以在Matts之間向您指出您不接受(單擊您的問題的答案旁邊的複選框)。我不是說你應該接受我的回答(其他答案是正確的,並且是第一個);我只是說,如果你這樣做的話,人們會更傾向於幫助你,因爲這是他們首先提供幫助的主要動機之一。 – matt 2013-04-06 18:01:33