無數人趟過此坑,大部分人在坑中一蹶不振,小部分人爬起來也是跌跌撞撞。ios
有不少人都說auto layout和manual layout的座標設置是不能混用的,會致使出現佈局問題。首先聲明一點,autolayout和manuallayout是能夠混用的。用的時機很重要,auto layout和manual layout有各自的生命週期和做用域,區分他們兩個的做用時間很關鍵,頭腦中必定要清楚你所添加的每條約束,在什麼時間場合,會形成什麼後果。不然,佈局就會和預想的不一樣,各類奇怪的佈局問題也就接踵而至。佈局
咱們在controller視圖上面用auto layout添加了一個subview,並在各個系統調用聲明週期方法中作了打印處理,結果以下:spa
其中前面帶有「-」符號的表示的是subview視圖的打印。orm
autolayout的做用範圍是從上往下第三個方法-updateConstraints一直到viewDidLayoutSubviews,這期間,系統是經過view上的約束來計算view上的佈局。而咱們通常習慣將佈局寫在viewDidLoad裏面,這就是咱們爲何老是沒法用manual layout的方法去修改咱們的佈局。生命週期
要想修改佈局,必需要在autolayout結束以後纔會起做用,不然會被系統將咱們的佈局按照autolayout從新刷新,從上面咱們能夠看到,咱們能夠在子視圖的-layoutSubviews和-drawRect方法裏面修改子視圖的佈局,可是通常視圖爲了重用不會在本身的類裏面將frame寫死,這樣咱們只有經過controller的viewDidAppear方法修改視圖的frame。可是這樣也有問題,在viewDidAppear裏面修改佈局,咱們能夠看到一個明顯的延遲,系統調用次序使然,咱們沒法去改變。除此以外,若是咱們更新了視圖的autolayout,會致使視圖從新調用updateViewConstraints方法,viewDidAppear在進入頁面的時候卻只調用一次,結果就是subview又恢復了原來的樣子。作用域
因此個人建議就是不要同時manual layout+auto layout去控制同一個視圖。始終記得若是用了auto layout去控制了一個視圖,那麼就要堅持用下去。開發
我以爲混用的說法不是對於某一個視圖說的,是說咱們整個佈局當中交叉使用了manual layout + auto layout,好比咱們能夠用auto layout佈局viewA,而後用manual layout 佈局B,而後將A與B用二者其一的方式,添加到共同的父viewC上,這就是我所認爲的混用。it
那麼它的意義是什麼呢?不一樣view的複雜度決定了咱們採起哪一種方式來對其佈局,咱們在開發中有可能會遇到某些流式的佈局,咱們用autolayout能夠行雲流水,可是對於某個視圖當中極其複雜的小控件的佈局,auto layout顯然要寫很多的一大段,當二者組合時也就是混用的意義所在。io
混用的風險其實一點不比它帶來的好處小,首先解釋一個名字date
NSAutoresizingMaskLayoutConstraint
這個類型和NSLayoutConstraint 功能相似,它是個私有類,咱們沒法獲取到,由於蘋果ios6以後推出了auto layout技術,可是還想兼容原來的autoresizing,因此它將autoresizing轉化爲了約束,轉化後的約束類型就是NSAutoresizingMaskLayoutConstraint,這就有可能致使系統爲咱們添加了許多咱們沒法預料的約束。
咱們有時候會發現咱們的約束沒有寫全,可是佈局卻很好,千萬不要太得意,這只是系統幫你完成你該作的,這種狀況當然對咱們有好處。可是在manual layout + auto layout佈局中就會發生大問題,系統不懂咱們是在故意不寫它的約束(由於咱們打算手動佈局這一塊的視圖),它就默默幫咱們加上了誰都不知道的約束,併爲本身的機智暗自欣喜。咱們要明確告訴它我不須要你的幫助才行。
UIView裏translatesAutoresizingMaskIntoConstraints屬性就是用來控制是否容許系統作這樣的轉化,默認是YES。因此咱們要把它設置爲NO,而後將你漏掉的約束通通加上。
怎樣算做完備的約束呢,個人建議是把視圖層次分清楚,每一個層次系統內部使用統一的佈局方案,並保證系統內的的約束完整。
這是一個視圖的層級拓撲結構(原諒我又盜圖了,湊合看吧),若是我打算在作黃箭頭位置的視圖佈局時採用auto layout,其餘採用manual layout那麼我只需保證它及它下面的兩個子視圖之間的約束完整就能夠了,他們三個能夠當作一個小的系統,系統內的約束只與他們本身相關,像下面兩個紅線鏈接的視圖間的約束就是不容許添加的。
圖:錯誤的約束關係
以上就是我想說的,混用這種手段仍是但願你們謹慎使用爲好,最後總結一下混用的關鍵點
1.首先要確保在你打算使用手寫auto layout爲view佈局前,將其translatesAutoresizingMaskIntoConstraints屬性設爲NO
2.不要用對同一個視圖同時使用manual layout + auto layout
3.確保你的約束在其系統內完好無損失。