最近被同行的一個朋友問到一個問題“UIScrollerview上添加子控件,給子控件約束好布局之後,還需要給scrollerview重新設置contentsize嗎?”於是想到了我自己曾經著手的一個項目,有一個界面就用到了scrollerView,裡面添加了子控件,我記得當時scrollerView的frame和屏幕的一樣,contensize最後是在裡面的子控件布局結束之後重新設置的,所以我的回答是需要設置呀。可是最後,那個朋友就告我讓我回去再試試,說是不需要設置的,還說可能是我和他那邊的需求不一樣我的才需要重新設置contentsize。最後自己就試了試,整理如下。
首先用storyboard創建一個UIScrollerview到當前view上,設置好上下左右的間距,更新布局,這時候肯定是沒有問題的,正常顯示。之後又放一個UIImageview到scrollerView上,上下左右到scrollerView的間距,更新約束,這時候卻顯示布局報錯,按理說正常的控件這時就可以正常工作吧。問題的關鍵在於如何給scrollView內部的子控件添加完整約束.scrollView內部子控件約束的添加需要遵循兩個原則:
1、scrollView內部子控件的尺寸不能以scrollView的尺寸為參照
2、scrollView內部的子控件的約束必須完整
首先,子控件的尺寸不能以scrollView的尺寸為參照,那麼我們有兩種選擇:
其次,約束"完整"的意思是說:子控件在水平及豎直方向上的約束要把scrollView"撐滿".
也就是說,在水平方向上,我們需要設置:
豎直方向上也一樣,要設置:
上面我的問題就在於沒有設置UIImageView的尺寸。
這是因為,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