約束沖突問題總結

如何避免產生約束問題

1. 不要試圖用masonry去更新xib的約束

原因:masonry內部會判斷如果是系統的約束就不處理,反而添加了新的約束,這樣必然會出現約束沖突問題。

2. tableHeaderView約束優先級要降低

原因:我們要創建一個view讓tableHeaderView=view,并在view上添加子的我們需要的那個整體view。然后約束時候要降低優先級。這樣當tableHeaderView在height=0瞬間不至于約束出問題。

3. tableView使用估計高度時候要降低更新高度的約束優先級

原因: 在使用tableView估計高度時候,系統會自動計算出cell的高度并給UITableViewCellContentView添加一個高度的約束。當重用時候我們更新了cell子視圖的高度導致整個cell高度變高和一開始的系統自動計算的高度約束沖突。這時候我們降低更新的子視圖的高度約束的優先級可以避免和之前系統計算出來的cell高度約束沖突。

4. 當一行布局了多個lab時候要添加兩者的橫向約束并設置好相應的抗壓縮抗拉伸優先級

原因:一行布局多個lab時候如果我們不設置兩個lab之間的約束,那么當兩個lab要顯示很長的文字時候會出現兩個lab重疊現象,我們當然不希望用戶看到這種顯現象,所以兩個lab中間一定要設置約束距離。

當我們設置了兩個lab之間的約束距離后就要設置好兩個lab的抗壓縮抗拉伸優先級。因為lab有自動適應尺寸的特性。所以我們利用抗拉伸優先級來控制允許哪個lab的文字寬度小于控件自身高度,當然抗拉伸優先級較低的lab的文字寬度會小于控件本身的寬度。(如果不設置,系統將不知道到底哪個lab文字寬度可以小于控件自身的寬度,所以就出現了約束警告問題,圖層中會有嘆號)

之后我們要設置好相應的抗壓縮優先級,決定當文字多的情況下,到底哪個要進行壓縮顯示省略號,當然抗壓縮優先級小的那個要顯示省略號。

默認的抗拉伸優先級大小是250(UILayoutPriorityDefaultLow)。
默認的抗壓縮優先級大小是750UILayoutPriorityDefaultHigh)
還有兩位兩個優先級的宏可以用(UILayoutPriorityFittingSizeLevel=50),(UILayoutPriorityRequired=1000)

如果產生約束問題如何解決

1. 如果控制臺打印約束警告問題,并試圖打破哪個約束來解決問題,界面又顯示的正常
  1. 是不是用masonry更新了xib的約束導致了新增一個沖突的約束。這時候要用xib拖約束方式更新值。
  2. 是不是系統導致一瞬間tableHeaderView.height=0導致了約束沖突。這時候要降低約束優先級
  3. 是不是使用tableView的估計高度來自動適應cell行高,但是認為的更新了cell子視圖的高度。這時候也要降低更新高度約束的優先級。
2. 查看圖層看到右上角有約束警告嘆號
  1. 查看布局中是不是一行有多個lab這種自動適應尺寸的控件,但是沒有設置好抗壓縮抗拉伸優先級。這時候要設置好相應的抗壓縮抗拉伸優先級。約束沖突問題總結
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容