xcode6 scrollview autolayout

简介:

普通的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是这几个子视图的父视图。添加的约束:leading20,trailing20。

5、给content1添加固定的宽和高:280,100。之所以要固定的宽和高,是因为不固定就无法确定containerView的宽高,也就无法确定

scrollview的内容大小。然后添加bottom20,也就是与content2相距20

6、给content2添加top20,bottom20,固定的高100,这不需要设置固定的宽了,因为content1已经设置了。

同理,给content3添加top20,bottom20,固定的高100,

给content4添加top20,bottom100(to supperview),

这样containerView的宽就由content1~content4确定了,而高因为content1与containerView顶端相距20,

content4的bottom与containerView相距100,也就确定了containerview的高度。



而containerview也就是scrollview的内容,那么确定了contaienrview的内容大小,也就是

确定了scrollview的内容的大小,所以自动布局也就完成了。


总结:对于scrollview的自动布局,使用一个参考视图来布局,化零为整(把一堆子控件放到一个统一的视图中,即containerView),

可以减少自动布局的难度,添加约束时,子视图的leading和trailing约束是相对于scrollview的,而不是containerview。


Quetion:这样自动布局只是对宽度和高度确定(content1的宽和高被设置成固定的)才完成自动布局,如果

是动态的宽高呢,又该如何添加约束?完成这个demo后,提出了此问题,然后高手出来解答,然后在回复中

说明一下,或者给相关博客的链接,谢谢!!!!!


参考:https://developer.apple.com/library/ios/technotes/tn2154/_index.html

参考:http://blog.csdn.net/kmyhy/article/details/39929117


想看看源代码:https://github.com/632840804/ScrollViewAutoLayout


目录
相关文章
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
873 0
|
7月前
|
jenkins Unix 持续交付
个人记录jenkins编译ios过程 xcode是9.4.1
个人记录jenkins编译ios过程 xcode是9.4.1
108 2
|
7月前
|
Linux 数据安全/隐私保护 iOS开发
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
|
4月前
|
iOS开发 MacOS Perl
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
159 4
|
4月前
|
iOS开发 开发者
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
282 3
|
4月前
|
iOS开发
mac不通过Xcode直接打开IOS模拟器
mac不通过Xcode直接打开IOS模拟器
242 2
|
4月前
|
缓存 iOS开发
如何在Xcode删除某个版本的IOS模拟器
如何在Xcode删除某个版本的IOS模拟器
622 1
|
6月前
|
iOS开发
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
59 1
|
7月前
|
存储 定位技术 iOS开发
XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题
XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题
113 0