UIScrollerview的contentsize設置


  最近被同行的一個朋友問到一個問題“UIScrollerview上添加子控件,給子控件約束好布局之后,還需要給scrollerview重新設置contentsize嗎?”於是想到了我自己曾經着手的一個項目,有一個界面就用到了scrollerView,里面添加了子控件,我記得當時scrollerView的frame和屏幕的一樣,contensize最后是在里面的子控件布局結束之后重新設置的,所以我的回答是需要設置呀。可是最后,那個朋友就告我讓我回去再試試,說是不需要設置的,還說可能是我和他那邊的需求不一樣我的才需要重新設置contentsize。最后自己就試了試,整理如下。

  首先用storyboard創建一個UIScrollerview到當前view上,設置好上下左右的間距,更新布局,這時候肯定是沒有問題的,正常顯示。之后又放一個UIImageview到scrollerView上,上下左右到scrollerView的間距,更新約束,這時候卻顯示布局報錯,按理說正常的控件這時就可以正常工作吧。問題的關鍵在於如何給scrollView內部的子控件添加完整約束.scrollView內部子控件約束的添加需要遵循兩個原則:

1、scrollView內部子控件的尺寸不能以scrollView的尺寸為參照
2、scrollView內部的子控件的約束必須完整

首先,子控件的尺寸不能以scrollView的尺寸為參照,那么我們有兩種選擇:

  • 提供一個具體值的約束(比如200)
  • 子控件的尺寸可以參照scrollView以外其它的控件的尺寸(如控制器的view的尺寸)

其次,約束"完整"的意思是說:子控件在水平及豎直方向上的約束要把scrollView"撐滿".

也就是說,在水平方向上,我們需要設置:

  • 子控件左側與父控件的距離
  • 子控件自身的寬度
  • 子控件右側距父控件的距離.

豎直方向上也一樣,要設置:

  • 子控件頂部距父控件的距離
  • 子控件的高度
  • 子控件底部距父控件的距離.

 上面我的問題就在於沒有設置UIImageView的尺寸。

為什么scrollView如此特殊呢?

這是因為,scrollView需要根據添加在其內部的子控件的寬高及與四周的距離計算出它的contentSize.

例如:
一個添加在scrollView內部的imageView的寬高為{80, 50}, imageView距離上左下右的距離分別為:100, 200, 300, 400,那么不需要用代碼賦值contentSize,我們就可以打印出scrollView的contentSize為{680, 450}.
如圖:

 

也就是說,子控件的約束決定了container的尺寸(contentSize).

這里自己用storyboard親測是可以的,壓根不需要設置contentsize;然而在用我自己常用的布局框架SDAutolayout卻發現了問題,contentsize始終為最初的屏幕大小,最后又用布局框架Masonry試了一遍,這時候卻是可以的,好吧,到這里我只能說,SDAutolayout原來還有這個問題,我原來的項目scrollerView布局正好用的SDAutolayout,真的坑死我了,明明是此布局框架的問題,請注意了!!

原帖:http://blog.csdn.net/u014795020/article/details/51893943


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM