當(dāng)通過IB對UIScrollView使用Autolayout時(shí),與正常情況有一些不同,需要特別注意。
首先對于UIScrollView本身的位置和大小的約束與對其他組件的設(shè)置相同。

之后對于UIScrollView的內(nèi)容的約束需特殊處理,因?yàn)閁IScrollView通過contentSize屬性來決定其內(nèi)容即可滑動(dòng)部分的大小,所以與普通UIView布局子view的不同之處在于,對于 UIScrollView的子view來說,它的leading/trailing/top/bottom space是相對于 UIScrollView的contentSize而不是bounds來確定的,所以當(dāng)你嘗試用UIScrollView和它 子view的 eading/trailing/top/bottom 來互相決定大小的時(shí)候,就會出現(xiàn)「Has ambiguous scrollable content width/height」的warning。子view的寬高不能通過Leading, Trailing, Top, Bottom來確定,邊距的作用是于子view的寬高一起來確定contentSize。可以先在UIScrollView中嵌入一個(gè)普通UIView如contentView作為真正的子view的container,方便管理,也可直接嵌入真正的子view,原理都是一樣的。就是contentView的寬或高不能通過依賴UIScrollView來實(shí)現(xiàn),根據(jù)情況,可以設(shè)置固定的寬度或高度的約束,或者依賴其他組件為參照物確定寬高,比如superView,另外,對于某些控件,例如 UILabel,UIImageView,它們的尺寸是可以通過其內(nèi)容決定的。最終的contentSize是contentView的寬高和邊距的和。


如上兩幅圖所示當(dāng)向UIScrollView添加一個(gè)子view并設(shè)置Leading, Trailing, Top, Bottom約束時(shí),系統(tǒng)并不能確定其contentSize,會提示Has ambiguous scrollable content height/width,而如果換成UIView的話此時(shí)的約束已經(jīng)是完整的。當(dāng)向子view添加了寬高的約束時(shí)UIScrollView才能確定contentSize,顯示約束完整。而如果此時(shí)換做UIView會提示對于子view的寬高有約束沖突。
官方Technical Note中的提到的Pure Auto Layout Approach就是這個(gè)意思,Mixed Approach還要再研究下。
P.S:如果UIImageView的圖片是運(yùn)行時(shí)從服務(wù)器獲取,空得UIImageView無法確定大小,我們可以通過修改Intrinsic Size為 Placeholder來用一個(gè)臨時(shí)的占位尺寸來告訴storyboard,在你這里就按照這個(gè)尺寸走。這個(gè)占位尺寸僅在storyboard設(shè)計(jì)階段有效,不會影響到運(yùn)行時(shí)的尺寸。