分類: iPhone開發2014-12-10 14:49 5358人閱讀 評論(5) 收藏 舉報佈局
在《在UIScrollView中使用Autolayout佈局(1)》中,咱們介紹了一個簡單的例子,在UIScrollView中加入了2個使用Autolayout佈局的控件。spa
現實的狀況固然不止有這麼簡單。.net
咱們使用UIScrollView,一般是須要在上面放超過一個屏幕size的控件。blog
若是按照(1)的步驟,添加許多Label、TextField或者其餘控件,那狀況又會怎麼樣呢?開發
你會發現紅色的佈局錯誤又會出現,Autolayout佈局引擎會警告由於條件不足,所以不可以計算出UIScrollView的contentSize寬度或高度。get
這是由於咱們違反了第一條原則:UIScrollView 的contentSize依賴於subviewsscroll
大量的subviews使用了Top約束和Leading約束。這些約束都是相對於superview的。而superview是什麼?其實就是UIScrollView。float
這讓佈局引擎很矛盾,如何計算contentSize呢?要計算contentSize必須清楚每一個subviews的frame,而subviews的frame竟然又要依賴scrollView?程序
所以計算contentSize的條件不足。方法
你能夠不理會這個佈局錯誤而運行程序。但contentSize沒法計算的結果,會致使運行時UIScrollView沒法滾動。
所以當你發現UIScrollView沒法滾動時,每每是由於咱們違反了第一條原則,致使contentSize計算錯誤。
正確的步驟以下:
一、 拖入一個UIScrollView。
二、 設置UIScrollView的約束。例如Pin上、下、左、右邊距都爲0,將致使UIScrollView佔據整個視圖。
三、 拖入一個UIView,咱們不妨將它命名爲contentView。約束contentView的寬和高,使他能知足你的佈局須要,可以擺放下全部你想擺放下的控件(通常來講都會超過屏幕的大小)。例如:width 等於ViewController’s view 的width,height等於800。
四、 而後重要的來了,設置UIView的Pin約束,上下左右都爲0。Why?明明設置了寬和高了呀,UIScrollView還不能計算出contentSize嗎?相信我,若是你不作這一步,我保證你的UIScrollView仍是不能滾動。這4個Pin約束其實是用於告訴UIScrollView:我會把你的內容「撐到」多大。也就是說,contentSize必須根據UIView的4條邊來肯定,而不是根據別的什麼方法來肯定。這樣,UIScrollView就把contentSize的4條邊和UIView的4條邊關聯起來了。若是UIView的4條變發生變化,則不用你說,UIScrollView會自動調整contentSize。
五、 剩下的事情就無所謂了。隨便在這個UIView上佈局你的控件吧,它們都能正確佈局。例如咱們在UIView左上角放了一個Label(約束:top、leading),右下角放了一個Label(約束:bottom、trailing)。固然,這些約束都只是和contentView相關,沒有和UIScrollView相關。否則又會致使佈局衝突。