2013-04-05 38 views
1

我試圖通過編程方式將按鈕添加到已經在視圖中的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。它似乎不應該導致任何衝突,所以我在哪裏?

回答

2

你實際上是使種錯誤的,你可以用約束使得:你的約束衝突曖昧!通過將translatesAutoresizingMaskIntoConstraints設置爲NO來消除衝突,正如其他人所說的那樣,但是隨後開始擔心模糊性。只有在指定佈局所需的所有時,才能成功使用約束。您正在指定頂部,但僅此而已;您還需要指定前沿(左側),可能還要指定寬度和高度(可能不是因爲按鈕有時具有固有尺寸;您將不得不實驗)。

+0

對!謝謝您的幫助。 translatesAutoResizingMask是缺失的位。之後,讓佈局行爲變得很簡單。 – Matt 2013-04-06 17:28:41

+1

一定要檢查模棱兩可!最好的方法是:在調試器中暫停,並在調試器控制檯的命令行中說'po [[UIWindow keyWindow] _autolayoutTrace]'。 – matt 2013-04-06 17:58:28

+1

另外,既然您也是@Matt,我覺得我可以在Matts之間向您指出您不接受(單擊您的問題的答案旁邊的複選框)。我不是說你應該接受我的回答(其他答案是正確的,並且是第一個);我只是說,如果你這樣做的話,人們會更傾向於幫助你,因爲這是他們首先提供幫助的主要動機之一。 – matt 2013-04-06 18:01:33

1

您得到的錯誤是因爲您沒有選擇通過在子視圖上調用setTranslatesAutoresizingMaskIntoConstraints:來自動佈局。

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