約束衝突問題總結

如何避免產生約束問題

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

緣由:masonry內部會判斷若是是系統的約束就不處理,反而添加了新的約束,這樣必然會出現約束衝突問題。佈局

2. tableHeaderView約束優先級要下降

緣由:咱們要建立一個view讓tableHeaderView=view,並在view上添加子的咱們須要的那個總體view。而後約束時候要下降優先級。這樣當tableHeaderView在height=0瞬間不至於約束出問題。ui

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

緣由: 在使用tableView估計高度時候,系統會自動計算出cell的高度並給UITableViewCellContentView添加一個高度的約束。當重用時候咱們更新了cell子視圖的高度致使整個cell高度變高和一開始的系統自動計算的高度約束衝突。這時候咱們下降更新的子視圖的高度約束的優先級能夠避免和以前系統計算出來的cell高度約束衝突。it

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

緣由:一行佈局多個lab時候若是咱們不設置兩個lab之間的約束,那麼當兩個lab要顯示很長的文字時候會出現兩個lab重疊現象,咱們固然不但願用戶看到這種顯現象,因此兩個lab中間必定要設置約束距離。io

當咱們設置了兩個lab之間的約束距離後就要設置好兩個lab的抗壓縮抗拉伸優先級。由於lab有自動適應尺寸的特性。因此咱們利用抗拉伸優先級來控制容許哪一個lab的文字寬度小於控件自身高度,固然抗拉伸優先級較低的lab的文字寬度會小於控件自己的寬度。(若是不設置,系統將不知道到底哪一個lab文字寬度能夠小於控件自身的寬度,因此就出現了約束警告問題,圖層中會有歎號)table

以後咱們要設置好相應的抗壓縮優先級,決定當文字多的狀況下,到底哪一個要進行壓縮顯示省略號,固然抗壓縮優先級小的那個要顯示省略號。class

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

若是產生約束問題如何解決

1. 若是控制檯打印約束警告問題,並試圖打破哪一個約束來解決問題,界面又顯示的正常
  1. 是否是用masonry更新了xib的約束致使了新增一個衝突的約束。這時候要用xib拖約束方式更新值。
  2. 是否是系統致使一瞬間tableHeaderView.height=0致使了約束衝突。這時候要下降約束優先級
  3. 是否是使用tableView的估計高度來自動適應cell行高,可是認爲的更新了cell子視圖的高度。這時候也要下降更新高度約束的優先級。
2. 查看圖層看到右上角有約束警告歎號
  1. 查看佈局中是否是一行有多個lab這種自動適應尺寸的控件,可是沒有設置好抗壓縮抗拉伸優先級。這時候要設置好相應的抗壓縮抗拉伸優先級。約束衝突問題總結
相關文章
相關標籤/搜索