IOS的UIScrollView的自動佈局html
標籤:iOS UIScrollView 自動佈局ios
轉載於 http://blog.csdn.net/dongtaochen2039/article/details/41749209 感謝博主的分享。xcode
最近在研究ios開發,遇到的UIScrollView的自動佈局問題,特記錄之。app
終結的要點有:框架
添加一個AnchorView爲UIScrollView的ContentView肯定寬高。ide
操做以下:佈局
咱們須要本身完成一個相似於collection view 的功能。完成的效果圖以下:url
上面的標題欄總體是一個view,下面的工做區是scrollview。自動佈局後橫屏效果以下:spa
最外層的view是根視圖,第一個view(包含兩個button,和p_w_picpathview的)是標題欄。第二個view(包含scrollview的)是scrollview的滑動區,就是上圖的工做區。.net
之因此這麼設計就是將複雜的佈局簡單化,這樣原先標題欄好幾個視圖和scrollview的自動佈局就變成一個view和scrollview的自動佈局。總體框架圖以下:
首先先對區域1和區域2的父view進行自動佈局,他們的自動佈局比較簡單,寫出上下左右的間距便可。
下面咱們主要講解下區域2的佈局。咱們平時對 scrollview進行佈局,咱們知道scroll view除了自身的佈局須要考慮(x, y, width, height)外,還有一個contentSize屬性也必需要在佈局的過程當中進行肯定,contentSize是UIScrollView用於肯定它所 要展現的內容尺寸的大小,而這個contentSize在佈局中其實是又scroll view的子view :content view的寬和高實現的,注意:咱們不能將content view的寬和高的約束設定爲由scroll view決定(如和scroll view等寬、等高),不然,Xcode會有警告:scroll view的content size不肯定!
在這種狀況下,咱們必需要對content view的佈局約束引入scroll view以外其餘參照物,咱們拖進來一個輔助的view做爲參照物or錨點,示意圖以下:
在storyboard中這3個視圖的結構以下:
經過這個參考view,肯定content view的寬度和高度,儘管content view的尺寸能夠不依賴於scroll view,但咱們還不得不設定content view 和其父view的關係:具體而言就是要肯定content view和scroll view的top, bottom, leading和trailing contstraints,這個地方可能比較具備迷惑性,緣由是蘋果對於這四個約束的使用在scroll view中作了變化:它再也不是肯定content view尺寸的依據,而是幫助scroll view中content view四周的邊界(or你能夠理解爲留白),進而肯定scroll view的contentSize屬性。
contentView具體的約束以下:
scrllview的約束能夠指定充滿父view,anchor view左邊、右邊、上邊緊挨父視圖。這會xcode會讓你指定anchor view的高度,不然會有***的提示信息。這樣再指定anchor view的高度就能夠了。這會你應該有疑問,anchor view不是用來肯定滑動區域content view的大小的嗎?若是把anchor view的大小寫死,contentView也不就不能改變大小了嗎?咱們須要在代碼裏面動態的更改anchor view的大小,在咱們的代碼裏面也就是高度,由於寬度是屏幕寬度,不用更改。anchor view的高度約束以下圖所示:
這裏我隨便付的值,而後在代碼裏面動態調整高度,修改的代碼以下:
[objc] view plaincopy
//計算contentView的高度
int rowNums = (appDelegate.workerList.count+COLUMN_COUNT-1)/COLUMN_COUNT;
int totalHeight = VIEW_HEIGHT * rowNums + (rowNums+1)*MIDDLE_GAP+100;
//找到anchor view的高度約束脩改高度
NSArray *arrs = scrollAnchorView.constraints;
for (NSLayoutConstraint *attr in arrs) {
if(attr.firstAttribute == NSLayoutAttributeHeight){
attr.constant = totalHeight;
}
}
//更新父視圖約束條件
[scrollAnchorView.superview.superview updateConstraints];
上面的代碼放在你須要動態肯定contentview高度的地方。修改好以後,就能夠看到剛開始的效果了。