2014-12-25 157 views
1

我有一個適用於縱向模式和橫向模式的應用程序。當我轉動設備時,我的一些標籤和按鈕沒有顯示,所以我想讓它們在側面。如何在不移除約束的情況下「禁用」約束?

有一種方法,以消除制約

[self.view removeConstraint:myConstraint]; 

這種方法消除了約束,所以當我打開設備返回到肖像模式,我必須用代碼是很無奈再次創建約束。

有沒有什麼辦法可以在不實際刪除它們的情況下禁用約束?

+0

你有沒有考慮使用約束,實際工作的肖像和風景?你可以在iOS8中使用它的大小類。 –

回答

1

這種方法消除了約束,所以當我把設備轉換回肖像模式時,我必須再次用代碼創建約束,這真是令人沮喪。

停下來問問自己,爲什麼它「真的令人沮喪」。它不應該!如果是這樣,你做錯了。

刪除約束條件並將其替換爲其他約束條件是標準程序,非常簡單。在界面之內和之外交換約束是您如何移動事物,特別是作爲響應旋轉而更改界面的一種方式。這只是一個讓你的鴨子連續排列的問題。將一組約束放在一個數組中;將另一組約束放在另一個數組中;當它交換的時候,刪除一組並添加另一組!儘可能簡單。

下面是一些實際的代碼(這是斯威夫特,但不會傷害任何):

func doSwap(landscape:Bool) { 
    if landscape { 
     NSLayoutConstraint.deactivateConstraints(self.constraintsWith) 
     NSLayoutConstraint.activateConstraints(self.constraintsWithout) 
    } else { 
     NSLayoutConstraint.deactivateConstraints(self.constraintsWithout) 
     NSLayoutConstraint.activateConstraints(self.constraintsWith) 
    } 
} 

的使用注意事項的新的-IOS-8 NSLayoutConstraint.deactivateConstraintsNSLayoutConstraint.activateConstraints。這是一個真正的工作保護程序,因爲您不需要將約束條件附加到任何特定視圖;它會自動完成。

+0

Matt,你有沒有發現新的activateConstraints和deactivateConstraints工作正常?我試圖用它們回答另一個問題,但我無法讓他們工作。例如,我可以激活一組約束(來自outlet集合)而不關閉最初的約束,即使它們有衝突的約束(視圖顯示了它應該在新激活的約束的位置),我也沒有錯誤。當我旋轉到風景並返回時,視圖回到原始約束。 self.view.constraints的日誌顯示它們全部。 – rdelmar

+0

更正可能最後評論。實際上,在這兩組約束都處於活動狀態(在對已卸載的組調用activateConstraints之後)中,視圖被放置在看起來像兩組混合的東西中。如果我停用原始設置並激活新設置,則視圖就是它應該在的位置,但仍然會在旋轉後恢復到最初安裝的位置。 – rdelmar

+0

@rdelmar那麼,我從工程中獲得了這個代碼的示例項目;在這裏,如果你想嘗試一下(當然如果這些命令有問題,我真的想知道它!):https://github.com/mattneub/Programming-iOS-Book-示例/ tree/b8afd9e2d50a7877f866a699abbf3d0cd7d20d85/bk2ch01p032constraintSwapping2 – matt

3

如果您有約束條件作爲iVar,您可以從視圖中刪除它,保留對它的強引用,然後在需要時將其添加回來。

它節省了必須重新創建它。

-3

禁用所有的表約束

ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName 

- 啓用所有表約束

ALTER TABLE TableName CHECK CONSTRAINT ConstraintName 
相關問題