2013-01-07 53 views
32

我需要將translatesAutoresizingMaskIntoConstraints設置爲NO。默認情況下,它設置爲YES(以協助大多數從struts和彈簧過渡到新Auto Layout的應用程序)。在Xcode 4.5中設置轉換自動化超大小寫限制的位置

Xcode中是否有某個地方的默認值可以從YES更改爲NO

或者我必須爲每個視圖手動設置它嗎?

回答

17

這是一個很好的問題 - 我試圖找到自己的答案。可悲的是,它看起來沒有「快速修復」。目前,蘋果認爲,基於約束的佈局選擇加入 - 即使命名UIView Class Reference的部分:

選擇啓用基於約束的佈局

但是,選擇加入是不是全球性的。我想這是因爲如果你只是把Struts變成約束,那麼並不是所有的東西都看起來不錯。某些UI元素會中斷,否則會產生大量不可滿足的約束錯誤。

我能想到的一個可能的解決方案 - 我還沒有嘗試過自己,但你可以做一個品類上UIView,設置所有UIView對象返回NO- (BOOL)translatesAutoresizingMaskIntoConstraints。雖然我不知道這會破壞什麼,但它會全局設置translatesAutoresizingMaskIntoConstraintsNO

這裏是a good introduction to Categories if you want to learn more about them

+0

如何使用類別來設置所有的UIView對象返回沒有?類別方法只適用於一個實例。 – Boon

+2

這個答案已被接受,但它的工作?我希望這種方法有問題。 –

+0

類別方法破壞原始方法@Boon,並且每個實例使用新的實現。 [除非原始方法本身在類別中實現](http://stackoverflow.com/a/7013922/603977)。 –

3

當你必須改變你的子視圖的大小或位置。在設置子視圖的框架之前使用(BOOL)translatesAutoresizingMaskIntoConstraints方法。

[self.benchmarkButton removeFromSuperview]; 
[self.benchmarkButton setTranslatesAutoresizingMaskIntoConstraints:YES]; 
[self.benchmarkButton setFrame:CGRectMake(20, self.benchmarkButton.frame.origin.y+40, 260, 30)]; 
[self.benchmarksView addSubview:self.benchmarkButton]; 

這就是你的子視圖不會與約束作鬥爭,因爲它是Xcode 4.3和更高版本中的默認(AutoLayout)。謝謝

+0

不錯,但我猜你最終可能會以這種方式進行衝突,而不是考慮使用現有的約束條件。 –

17

我遲到了這個問題,但提到的選項仍然缺失在Xcode 5 & 6,所以這個問題仍然是有意義的。

實際上,我們總是可以通過在Storyboard(Interface Builder)中添加一個用戶定義的運行時屬性來爲視圖/控件/對象的任何屬性設置一個值,如以下屏幕截圖所示。

它也適用於translatingAutoresizingMaskIntoConstraints。所以這個問題可以解決。

enter image description here

+0

這是一個很流暢的解決方案,但我相信它會導致XCode 6.3 beta 2中的「凍結」。當我刪除它時,我的視圖加載得很好..但是在它升級到beta 2後它崩潰了。 –

+2

This任何需要更新解決方案的人都可以在XCode 9和iOS 11中正常工作。這應該是現在接受的答案。 – JasonD