当通过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设计阶段有效,不会影响到运行时的尺寸。
网友评论