最近被同行的一個朋友問到一個問題“UIScrollerview上添加子控制項,給子控制項約束好佈局之後,還需要給scrollerview重新設置contentsize嗎?”於是想到了我自己曾經著手的一個項目,有一個界面就用到了scrollerView,裡面添加了子控制項,我記得當時scrollerView ...
最近被同行的一個朋友問到一個問題“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