前言
今天做項目,碰到一個需求,在一個Cell中,因為需要適配4‘,所以需要將原本的一行按鈕換成UIScrollView,可以滑動。如圖:
開始
這還不簡單,直接將原本的存放按鈕的UIView
改成UIScrollView
不就好咯。不一會就改好了,然后運行;發現還是不能動?。。ㄒ荒樸卤疲?。
怎么辦?又仔細查看了一遍,發現沒有什么地方有寫錯阿。
然后Google了下,發現好像是autolayout這貨的問題,于是我就試著不用autolayout看看能不能滾動,直接用frame來設置位置和大小,結果果然可以滾動了!
然后
但到底是autolayout哪里出錯了,于是去查了下官方文檔,看看有沒有什么可以發現的。果然讓我找到了,原因如下:
The UIScrollView class scrolls its content by changing the origin of its bounds. To make this work with Auto Layout, the top, left, bottom, and right edges within a scroll view now mean the edges of its content view.
如上圖所示,之前我們設置的四個約束(上下左加寬度),其實參照物不是scrollView
,而應該是外面的contentSize
,為什么呢?因為scrollView
是會滾動的,所以如果參照的是scrollView
的話,那么按鈕的位置就不是確定的了,所以參照的其實是contentSize
。換句話說其實,scrollView
就是根據內部按鈕的frame計算出scrollView
的contentSize
。(因為autolayout本質依然是frame)。
這個時候我們再看下我們之前設置的四個約束,我們設置了上下左加寬度約束,這個時候發現scrollView
并沒有足夠的條件去求出contentSize
,因為右邊并沒有確定,所以這個時候滾動并沒有效果。這個時候我們只需要加上按鈕的右邊約束就可以有效的算出contentSize
,而且可以不用去設置scrollView
的contentSize
屬性了,因為已經可以根據約束推測出來。
最后
蘋果的官方文檔是個好東西??