2013-03-14 54 views
0

我相信這肯定是一個常見問題。我有一個UIViewController,它有一個UINavigation欄和一個ContentView(它包含UIView和一堆兒童控件,用戶可以通過向左滑動來隱藏這個內容視圖,然後在屏幕左側顯示動畫。棒擴展和填充整個寬度不能鏈接這兩個與界面生成器,所以它必須在代碼來完成沒有問題:。組織代碼和IB之間的NSLayoutContraints

// Called from viewWillAppear 
    -(void)addLayoutConstraints{ 
     UINavigationBar *navigationBar = self.navigationBar; 
     UIView *facetView = self.facetViewController.view; 
     NSDictionary *views = NSDictionaryOfVariableBindings(navigationBar, facetView); 
     NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[facetView]-[navigationBar]-|" 
                       options:NSLayoutFormatAlignAllBaseline 
                       metrics:nil 
                        views:views]; 
     [self.view addConstraints:constraints]; 

    } 

剪斷應該這樣做就好了這段代碼的問題是,我已經在IB中佈置了UINavigationBar,以便我可以輕鬆地爲其添加自定義按鈕並查看它等等。問題是,當我在IB中放置導航欄時,IB添加了一堆不可能的默認約束其中一個與我在上面的代碼中添加的相沖突

你如何解決這個問題?這裏有3種可能性:

1.)我也可以編程創建UINavigation欄。這樣它只有我添加的約束條件。我不想這樣做,但它是一個選項

2.)使用IB,以某種方式刪除默認的約束,以便它們不會相互衝突。我沒有辦法做到這一點

3.)在代碼中,刪除IB添加到UINavigation欄的默認約束,然後添加我的自定義約束。我確實看到有removeConstraint和removeConstraints。我想我可以檢索約束,刪除它們,然後添加我自己的。再次,有點凌亂的過程。

您的意見是?你做過類似的事嗎?

+1

選項3是要走的路。您可以將IBOutlets製作爲IB爲您創建的任何約束,然後刪除它們或修改常數值。 – rdelmar 2013-03-14 18:51:43

+0

你如何做到這一點?我做了像NSArray * constraints = navBar.constraints seomthing; [self.view removeConstraints:constraints];這似乎刪除了其中的一些。我很好奇你想告訴我什麼。 – VaporwareWolf 2013-03-14 18:58:39

+0

您製作IBOutlets,並將它們連接到IB中的約束,就像您使用任何其他IBOutlet一樣(有時您可以單擊UI元素以便您可以看到約束並將它們連接到那裏,或者可以連接到列表屏幕左側場景列表中的約束條件)。然後在代碼中,使用插座名稱將其刪除。 – rdelmar 2013-03-14 19:02:33

回答

0

選項3是假定的方式。在本次WWDC 2012會議中正是提到 - Introduction to Auto Layout for iOS and OS X

+0

請注意,只有鏈接的答案是不鼓勵的(鏈接往往會隨着時間的推移變得陳舊)。 請考慮編輯您的答案並在此處添加摘要。 – kleopatra 2013-04-20 09:01:24

+0

這不是一個僅鏈接的答案。我在第一句話中回答了這個問題。第二句包含支持我的答案的*視頻*的鏈接。 – an0 2013-04-20 13:56:32

+0

同意,這有點臨界:-)嗯,有理由選擇選項3,不是嗎?對於一個好的答案,我希望你至少總結一下。 – kleopatra 2013-04-20 14:34:02