前言
今天做項(xiàng)目钉稍,碰到一個(gè)需求涤躲,在一個(gè)Cell中,因?yàn)樾枰m配4‘贡未,所以需要將原本的一行按鈕換成UIScrollView种樱,可以滑動(dòng)。如圖:
開始
這還不簡(jiǎn)單俊卤,直接將原本的存放按鈕的UIView
改成UIScrollView
不就好咯嫩挤。不一會(huì)就改好了,然后運(yùn)行消恍;發(fā)現(xiàn)還是不能動(dòng)捌裾选!(一臉懵逼)狠怨。
怎么辦约啊?又仔細(xì)查看了一遍,發(fā)現(xiàn)沒有什么地方有寫錯(cuò)阿佣赖。
然后Google了下棍苹,發(fā)現(xiàn)好像是autolayout這貨的問(wèn)題,于是我就試著不用autolayout看看能不能滾動(dòng)茵汰,直接用frame來(lái)設(shè)置位置和大小,結(jié)果果然可以滾動(dòng)了孽鸡!
然后
但到底是autolayout哪里出錯(cuò)了蹂午,于是去查了下官方文檔,看看有沒有什么可以發(fā)現(xiàn)的彬碱。果然讓我找到了豆胸,原因如下:
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.
如上圖所示,之前我們?cè)O(shè)置的四個(gè)約束(上下左加寬度)巷疼,其實(shí)參照物不是scrollView
,而應(yīng)該是外面的contentSize
,為什么呢晚胡?因?yàn)?code>scrollView是會(huì)滾動(dòng)的,所以如果參照的是scrollView
的話嚼沿,那么按鈕的位置就不是確定的了估盘,所以參照的其實(shí)是contentSize
。換句話說(shuō)其實(shí)骡尽,scrollView
就是根據(jù)內(nèi)部按鈕的frame計(jì)算出scrollView
的contentSize
遣妥。(因?yàn)閍utolayout本質(zhì)依然是frame)。
這個(gè)時(shí)候我們?cè)倏聪挛覀冎霸O(shè)置的四個(gè)約束攀细,我們?cè)O(shè)置了上下左加寬度約束箫踩,這個(gè)時(shí)候發(fā)現(xiàn)scrollView
并沒有足夠的條件去求出contentSize
爱态,因?yàn)橛疫叢]有確定,所以這個(gè)時(shí)候滾動(dòng)并沒有效果境钟。這個(gè)時(shí)候我們只需要加上按鈕的右邊約束就可以有效的算出contentSize
,而且可以不用去設(shè)置scrollView
的contentSize
屬性了锦担,因?yàn)橐呀?jīng)可以根據(jù)約束推測(cè)出來(lái)。
最后
蘋果的官方文檔是個(gè)好東西??