普通的view布局是很简单的,只是添加上下左右就可以确定其位置及大小,可是使用Scrollview自动布局就很复杂了, 因为scrollview是没有固定的高度和宽度的,因为其宽度和高度是由其内容的大小所决定的,也就是所谓的contentSize所决定。 如果要使用自动布局,那么Scrollview的内容的大小不能依赖于scrollview的尺寸,否则就无法确定,就会发出警告。
这个是我们的效果图。下面看看怎么做的:
1、 根据官方提供的文档,如果我们直接把子控件放到Scrollview上,分别布局,是很难布局的,因此我们使用一个 containerView
,这个containerView
放所有的子控件,那么只要布局好所有的子控件与containerView
之间的布局关系, 那么剩下的就是containerView
与Scrollview
之类的布局关系,这也就是所谓的化零为整策略。
2、 首先放一个scrollview
到view
上,然后设置scollview
的约束:与view
的left
,top
,right
,bottom
分别为0,84,0,0。
3、 放一个view
作为containerView
到scrollview
中,作为子view
,作为参考系:在右侧document
中的Label
加入标识:containerView
,这个不一写需要添加,其实不加也没有关系,只是加了就更明确其用意。然后给containerView
添加与scrollview
的约束:上下左右分别设置为0。
4、 添加4个内容视图:分别加个标识为:content1
,content2
,content3
,content4
给这个子视图添加约束中,leading
和trailing
约束分别是与scrollview
的约束,而不是与containerview
的约束,虽然containerView
是这几个子视图的父视图。添加的约束:leading
20,trailing
20。
5、 给content1
添加固定的宽和高:280
,100
。之所以要固定的宽和高,是因为不固定就无法确定containerView
的宽高,也就无法确定scrollview
的内容大小。然后添加bottom
20,也就是与content2
相距20
6、给content2
添加top
20,bottom
20,固定的高100
,这不需要设置固定的宽了,因为content1
已经设置了。 同理,给content3
添加top
20,bottom
20,固定的高100
,给content4
添加top
20,bottom
100(to supperview), 这样containerView
的宽就由content1~content4
确定了,而高因为content1
与containerView
顶端相距20
,content4
的bottom
与containerView
相距100,也就确定了containerview
的高度。而containerview
也就是scrollview
的内容,那么确定了contaienrview
的内容大小,也就是确定了scrollview
的内容的大小,所以自动布局也就完成了。
对于scrollview
的自动布局,使用一个参考视图来布局,化零为整(把一堆子控件放到一个统一的视图中,即containerView
),可以减少自动布局的难度,添加约束时,子视图的leading
和trailing
约束是相对于scrollview
的,而不是containerview
。
本人推荐纯代码自动布局,可控性强,能适应需求快速变更。推荐使用Masonry
第三方库,这个是OjbectiveC
版本的,如果您是使用Swift
开发,推荐使用SnapKit
!!!
这样自动布局只是对宽度和高度确定(content1
的宽和高被设置成固定的)才完成自动布局,如果 是动态的宽高呢,又该如何添加约束?完成这个demo
后,提出了此问题,然后高手出来解答,然后在回复中 说明一下,或者给相关博客的链接,谢谢!!!!!
下载源代码:ScrollViewAutoLayout
承接:ThinkPHP项目开发、网站项目开发、微信项目开发、微信小程序项目开发、App开发,欢迎联系标哥QQ632840804