? ? ? ? 所知,UILabel繼承自UIView 滿足NSCoding,UIContentSizeCategroyAdjusting兩個協(xié)議。那么在Autolayout的世界中塔插,是否可以作為一視同仁呢冠摄?從中有能揭開多少autolayout的面紗呢糯崎?
????????形如圖1,考慮這樣一個問題:一個UIView 居中放置在一個控制器的View上河泳,其大小是由它的兩個子視圖的大小決定的沃呢。如果兩個子視圖的size已知,那么可以十分輕易的確定UIView的小大拆挥。
? ? ? ? 再者開來薄霜,兩個子視圖 可能是UIView 也可以是UILabel。當對于一個UILabel 來說纸兔,我們可以不用控制其長度惰瓜,因為它可以由自己的ContenSize來決定寬高。
? ? ? ? 試想汉矿,現(xiàn)在有一個需求鸵熟,動態(tài)的出現(xiàn)和消失第一個子視圖,這個時候负甸,如果用AutoLayout來解決問題流强,就要對第二個子視圖,添加一個低等級的約束呻待。
? ? ? ? 如圖2打月,對第二個子視圖添加一個低等級800對父視圖左邊的為0的約束。十分輕松的添加上了蚕捉。這個時對UILabel 進行同樣的操作奏篙,則出現(xiàn)了圖3的情況
? ? ? ? WTF?明明第一個UILabel迫淹,已經(jīng)確定了contensize秘通,為什么contensize的寬變成0,UILabel是有內(nèi)容的啊敛熬。難道是storyboard的問題肺稀,運行一下項目,無事發(fā)生应民。到底是什么原因呢话原?這里被絆住了好一陣夕吻。
? ? ? ? 結(jié)果是很簡單:你需要調(diào)節(jié)一下UILabel約束的等級,設(shè)置成700時繁仁,就會發(fā)現(xiàn)能按愿望完美展示了涉馅。具體的原因,猜想黄虱,應(yīng)該是UILabel的contensize的約束的等級的臨界值在700附近稚矿,當約束大于800會使得contensize的約束失效。即使UILabel內(nèi)部有text也起不到作用捻浦。
? ? ? ? 上篇說了晤揣,autolayout是可以在運行的時候進行調(diào)試的,下面就附上一個例子默勾。
? ? ? ? 圖4碉渡,可以看出右邊的UILabel聚谁,并沒有完全的展開母剥。具體什么原因,我們可以形导,打開Xcode自帶視圖調(diào)控环疼。獲取相應(yīng)的圖層結(jié)構(gòu)。
圖5朵耕,為左邊正常展開的UILabel的約束炫隶。圖6,為右邊不正常展開的UILabel的約束阎曹∥苯祝可以看到第二個self.width 變灰,證明其已經(jīng)失效了处嫌。如果一時間看不出來頭緒栅贴,我們可以查看一下父視圖的約束,如圖7.
大致看一下熏迹,你會發(fā)現(xiàn) self.trailing = label.trailing +40@1000檐薯。特別的扎眼。它讓self.trailing = label.trailing@1000注暗。失效了坛缕。回到原來的nib文件捆昏。
確實赚楚,在毫無感覺的情況下,我們添加了一個對allFordLabel的40的約束骗卜。刪掉這個約束直晨。文件沒有正常搀军,重新運行項目,視圖已經(jīng)恢復正常了勇皇。