[iOS-UIKit] UIScrollView Autolayout

當通過IB對UIScrollView使用Autolayout時,與正常情況有一些不同,需要特別注意。

首先對于UIScrollView本身的位置和大小的約束與對其他組件的設置相同。

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

如上兩幅圖所示當向UIScrollView添加一個子view并設置Leading, Trailing, Top, Bottom約束時,系統并不能確定其contentSize,會提示Has ambiguous scrollable content height/width,而如果換成UIView的話此時的約束已經是完整的。當向子view添加了寬高的約束時UIScrollView才能確定contentSize,顯示約束完整。而如果此時換做UIView會提示對于子view的寬高有約束沖突。

官方Technical Note中的提到的Pure Auto Layout Approach就是這個意思,Mixed Approach還要再研究下。

P.S:如果UIImageView的圖片是運行時從服務器獲取,空得UIImageView無法確定大小,我們可以通過修改Intrinsic Size為 Placeholder來用一個臨時的占位尺寸來告訴storyboard,在你這里就按照這個尺寸走。這個占位尺寸僅在storyboard設計階段有效,不會影響到運行時的尺寸。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容