我相信這肯定是一個常見問題。我有一個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。我想我可以檢索約束,刪除它們,然後添加我自己的。再次,有點凌亂的過程。
您的意見是?你做過類似的事嗎?
選項3是要走的路。您可以將IBOutlets製作爲IB爲您創建的任何約束,然後刪除它們或修改常數值。 – rdelmar 2013-03-14 18:51:43
你如何做到這一點?我做了像NSArray * constraints = navBar.constraints seomthing; [self.view removeConstraints:constraints];這似乎刪除了其中的一些。我很好奇你想告訴我什麼。 – VaporwareWolf 2013-03-14 18:58:39
您製作IBOutlets,並將它們連接到IB中的約束,就像您使用任何其他IBOutlet一樣(有時您可以單擊UI元素以便您可以看到約束並將它們連接到那裏,或者可以連接到列表屏幕左側場景列表中的約束條件)。然後在代碼中,使用插座名稱將其刪除。 – rdelmar 2013-03-14 19:02:33