簡體   English   中英

在代碼中修改故事板自動布局約束的最佳實踐?

[英]Best practice for modifying storyboard auto layout constraints in code?

我總是在代碼中完成我的UI,但已經決定我應該為當前項目使用故事板和自動布局。 一切都進展順利,直到我構建了一個復雜的場景,其中包含大約50個具有大量層次結構和一些視圖網格的視圖。

問題是我的自動布局在某些設備和方向上變得混亂。 我發現使用IB嘗試修復數十(數百?)個約束或追蹤問題並解決問題具有挑戰性。 情況是這樣的,我沒有得到錯誤或警告,有時只是一些不愉快的布局。 對於追蹤約束信息,您需要做的所有點擊和更改設置都會讓您感到痛苦,更不用說了解它們在場景中的相關性。

我花了一天時間閱讀有關自動布局和約束的文檔和背景材料,看來我最好的解決方案是使用可視化格式在代碼中指定約束並創建一些自定義代碼來幫助。 但是,我似乎無法找到有關如何從IB轉換為代碼的任何內容。

具體來說,我應該擦除所有IB約束並手動完成它們還是可以選擇性? 我問,因為我在包含內容視圖具有完美布局的視圖中有一些視圖組。

其次,我最好把代碼放在哪里? 我想共存故事板,只想有選擇地修改一些復雜的場景。 是視圖控制器的viewWillAppear:修改或刪除/添加它控制的視圖的約束的正確位置?

將您希望能夠在storyboard / xib文件中修改的NSLayoutConstraint的IBOutlet連接到控制器/視圖類。

連接布局對象后,可以修改.constant屬性並為視圖設置動畫:

[self.containerView layoutIfNeeded]; //make sure all layout operations are done
self.containerViewBottomLayoutConstraint.constant = 200.0; //change the layout
[UIView animateWithDuration:duration animations:^{
    [self.containerView layoutIfNeeded]; //animate the changes
}];

已更新:您可以在viewDidLoad,awakeFromNib,viewDidAppear或基於事件的情況下添加修改代碼。 這真的取決於你的意圖。

很抱歉這么長時間才能回到這個,而其他項目則被侵入。

我不得不做很多重構來簡化我的場景,以便自動布局可以做正確的事情,但我對結果並不完全滿意。 問題似乎是IB不容易使用大量項目,並且必要時自動布局很復雜。

據說,到目前為止我看到的最好結果來自Justin Driscoll的這篇文章: http//themainthread.com/blog/2014/02/building-a-universal-app.html

他主張構建自定義視圖以封裝可重用的UI組件。 我已經采用了這種方法,但已經擴展了這個想法,以便捆綁相關的組件,這些組件在布局更改時不會以非常不同的方式進行布局。 例如,我有一個帶按鈕和兩個標簽的進度條,所以即使我沒有將它們作為一個組重復使用,它們也需要相鄰並且在概念上是相關的,所以我為它們制作了一個自定義視圖來處理自動賈斯汀建議的布局。

我現在采取的方法是每個級別的自動布局應該只有少數幾個元素。 如果一個級別太復雜,我會在自定義視圖中捆綁一些相關項目,並在該新視圖中推送一些自動布局。 到目前為止還不算太糟糕。

使用那么多視圖時,自動布局非常棘手。 我使用了類似的復雜視圖結構,我發現最好盡量保留代碼或IB中的所有約束。 現在我們將他們留在IB。 我們將約束移動到代碼中的唯一時間是當我們支持不同的屏幕大小時,我們需要修改單個約束以使視圖正常工作。 我一直在修改viewDidLoad中的約束。

當一些事情搞砸了時,我幾乎總是必須對該視圖的所有約束進行核對並重新開始。 它很糟糕,但它通常比追蹤問題更快。 我們做的一件事就是更容易處理這類事情,就是將.xibs與故事板一起使用。 這樣,每個視圖都可以處理它自己的布局,您可以將其拉入一個位於故事板中的視圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM