總結(jié)一下,最近遇到的UIScrollView與AutoLayout在使用中的一些問題。
UIScrollView之前直接使用的情況比較少,所以對(duì)它的原理不是很清楚。這里其他的UIScrollView基礎(chǔ)不說了,只說說它的精髓contentSize。
1. contentSize默認(rèn)情況下width,height都為0.
2. contentSize為0并不會(huì)影響它的顯示.
3. contentSize小于UIScrollView的frame的size,UIScrollView是不會(huì)滑動(dòng)的.
4. 只需要更新contentSize的大?。ūWC比自身的frame的size大),就會(huì)自動(dòng)出現(xiàn)滾動(dòng)條,并不需要調(diào)用其他的方法(setNeedsLayout等).
下面說說,在Storyboard中,使用UIScrollView,常見做法。
1. 在View中添加一個(gè)UIScrollView.
2. 設(shè)置UIScrollView的上下左右邊距,都設(shè)置為0.

3. 添加一個(gè)contentView“蓋”在UIScrollView上面,并且設(shè)置它的上下左右邊距為0,View的寬與ScrollView的寬相同,高也相同。

4. 然后就可以把自己要添加的View 在添加到contentView上面。
這里有人要問了,為什么要contentView,我直接把view“貼”在scrollView上面不行嗎?
我們來看看直接貼到scrollView上面,會(huì)出現(xiàn)什么問題。

如上圖,我們想添加一個(gè)view,高度固定120,上邊距10,左右邊距各為10。往scrollView上面一貼,直接報(bào)錯(cuò)。
錯(cuò)誤原因:

為什么呢?
因?yàn)閟crollView的contentSize會(huì)根據(jù)它的子視圖進(jìn)行計(jì)算,而這里我們的view左右邊距又依賴于scrollView,根本算不出來。所以報(bào)錯(cuò)了。
上面的這個(gè)原因你可能不信,不過我可以證明給你看。我們把view的寬度固定到200,然后再給一下邊距10(這樣scrollView就可以計(jì)算出contentSize),我們也可以算出,scrollView的contentSize,寬為10(左邊距)+ 200(寬度) + 10 (右邊距),高為10(上邊距)+ 120(高度)+ 10(下邊距)。
然后我們運(yùn)行的結(jié)果如下:

跟我們的預(yù)期結(jié)果吻合。
按照上面的步驟設(shè)置完成之后,是不是就可以高枕無憂了?
我原來是這樣想,后來才發(fā)現(xiàn)并不是。
我們首先來歸一下類,自定義的View在contentView上面的布局的形式有幾種。
1. 高度固定,且總高度沒有超過contentView的
這種最簡單,直接往上面碼就行了。

2. 高度都固定,但是總高度超過了contentView
例如下面的,最后一個(gè)紅色的View都超過了contentView,我們還是先直接碼,但是最后發(fā)現(xiàn),并不能拖動(dòng)。

怎么辦?
很簡單,設(shè)置contentSize,使contentSize的高度大于你的View的總高度就可以滑動(dòng)了。
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
_scrollView.contentSize=CGSizeMake(375,2000); //2000是隨便設(shè)置,保證高度
}

好像是可以滑動(dòng)了,但是細(xì)心一點(diǎn)可以發(fā)現(xiàn),這里其實(shí)有一個(gè)bug,我們希望contentView總是能夠把我們的view完全的“包住”,但是這里,并沒有,仔細(xì)看上圖,黃色的是scrollView,藍(lán)色的是contentView,它并沒有將我們的view包住。這里就需要?jiǎng)討B(tài)的更改一下contentView的高度。
我們直接修改contentView的frame,企圖增加它的高度,但是不出意外是失敗了。這里我們就不演示了。為什么了,因?yàn)槲覀兦懊嬖O(shè)置它的高度約束,contentView的高度=scrollView的高度。
所以這里我們就需要更改一下contentView的高度約束,然后可以動(dòng)態(tài)的調(diào)整它。

然后在運(yùn)行時(shí)更改它


完成。
3. 一部分View高度固定,一部分不固定
//TODO: 這個(gè)下次再說。