UIScrollView與AutoLayout

總結(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è)下次再說。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 把大神的一些想法整理出來,方便以后查閱,如果涉及侵權(quán)問題,請(qǐng)與我聯(lián)系... 為什么要用一個(gè)container包含其...
    愛掏蜂窩的熊閱讀 871評(píng)論 0 0
  • 在IB中設(shè)置使用Autolayout來布局Scrollview有兩個(gè)小坑,花去半天的時(shí)間。具體看這篇文章:http...
    lanjing閱讀 1,378評(píng)論 0 0
  • UIScrollView是個(gè)非常特殊的view,UIScrollView與其subview之間相對(duì)位置的約束,并不...
    lever_xu閱讀 322評(píng)論 0 0
  • iOS的視圖中,UIScrollView是比較常用的視圖。但是UIScrollView在自動(dòng)布局中是一種特殊的視圖...
    流水_事閱讀 7,731評(píng)論 1 16
  • 今日2017年1月22日,周日,陰歷臘月二十五,天氣晴。 時(shí)間總在不經(jīng)意間流逝,春節(jié)將近,我仍然沒...
    Echo的樹洞閱讀 304評(píng)論 0 0

友情鏈接更多精彩內(nèi)容