Xcode7中自动布局AutoLayout和SizeClass的使用
2016-01-17 19:05
411 查看
Xcode7中自动布局autolayout和sizeclass的使用
周末宅在家里写自己的一个Demo的时候发现Xcode7中关于自动布局autolayout和sizeclass的使用和Xcode6有了很明显的变化。去年我曾写过一篇文章xcode6中自动布局autolayout和sizeclass的使用,转载量很大,但这篇文章在目前的Xcode7中已经有些过时了,这里为了不误人子弟,我决定再写一篇Xcode中如何使用autolayout和sizeclass布局进行多种设备的页面个性化匹配。关于autolayout是什么及其原理可以参见我去年写的那篇文章,这里直入正题,通过一个简单的小需求的从无到有的完成,感受一下Xcode7中,如何在storyboard中完成布局工作:
一、我们的需求
我们想完成这样一个简单的页面:页面中仅有一个button和一个view,我们想在iPhone横屏(landscape)和iPad上的时候让button和view呈左右排列;在iPhone竖屏的时候
(portrait)让button和view呈上下排列,如图1-1所示。
如何实现
在上篇文章中,我们讲解了sizeclass的意义,在storyboard中我们可以通过设置具体某个ViewController当前的sizeclass,然后完成特定sizeclass下的布局工作。在苹果的iPhone和iPad中,sizeclass定义了屏幕宽和高的两种尺寸特征:紧凑
(Compact)和正常尺寸
Recular,那么到底,紧凑和正常的定义是怎样的呢?下面简单列出了所有尺寸iOS设备(不含iWatch)横竖屏时对应的sizeclass类型,如横-[CR]表示横屏的时候宽度是紧凑的、高度是正常的,其他类同。
1. 3.5寸屏
iPhone4 & iPhone4S横-[CC] 竖-[CR]
2. 4.0寸屏
iPhone5 & iPhone5S横-[CC] 竖-[CR]
3. 4.7寸屏
iPhone6 & iPhone6S横-[CC] 竖-[CR]
4. 5.5寸屏
iPhone6+ & iPhone6S+横-[RC] 竖-[CR]
5. iPad
所有类型的iPad横-[RR] 竖-[RR]
从宽高特征出发,对于这个列表我们可以做如下总结:
1. 对于3.5、4.0、4.7寸屏的iPhone,无论横竖屏,宽度都无法满足是正常的(R),只有5.5寸屏的iPhone横屏的时候才能满足宽度是正常的;
2. 对于所有类型的iPhone,高度在横屏的时候都是紧凑的(C)、在竖屏的时候都是正常的(R);
3. 对于所有类型的iPad,横竖屏宽度和高度都是正常的(RR);
4. 对于宽度或者高度,如果即能试紧凑的也能是正常的,那么我们可以用Any来标记;
5. 对于iPad系类的设备,sizeclass是无法区分横竖屏的,如果要实现iPad上横竖屏不同的布局,只能代码实现(判断当前设备横竖屏状态,手动修改布局);
Xcode7中的变化
在Xcode7中我发现,通过设置sizeclass可以为不同的sizeclass匹配不同布局方式,但不同sizeclass之间不能有交集的,比如下面的[AA]和[CA]就是有交际的AA = CA + RA = (CC + CR) + (RC + RR),不能同时布局这两种sizeclass,否则会出现交叉覆盖、布局不满足的情况。
而对于下面的CA和RA则是没有交集的,可以同时使用。
这个小变化可以认为是苹果在Xcode7中对sizeclass的使用提出了更为严格的要求,以前的那种可以部分覆盖的情况现在不允许出现了,这虽然在一定程度上加大了布局工作量,但也避免了布局可能出现的混乱,这和swift中体现出的信息是一致的:拒绝模糊、尽量清晰、减少出错的可能。
由上述讨论可以得出以下结论:
1. 如果想设置多种sizeclass的布局效果,那个设置的多种sizeclass不能有交集;
2. 如果支持横竖屏,那么对于想支持的设备,设置的sizeclass必须要能完全覆盖住横竖屏的情况;
分析我们的sizeclass情况:
我们希望在所有的iPhone上竖屏的时候button和
view是上下排列(也即CR)在横屏上都是左右排列的(CC
+ RC) == AC;我们还希望在iPad上都是左右排列的(RR)。这样我们就需要对三种sizeclass组合进行分别的布局:
1. CR,iPhone竖屏;
2. AC,iPhone横屏
CC和
RC的组合;
3. RR,iPad横竖屏;
在弄清楚了需要这三种布局组合之后,我们首先要在
storyboard中将sizeclass设置成[AA],添加这三种布局使用到的共有的元素:button & view;然后再将
sizeclass设置成三种组合中的每一种进行各自的布局,这三种组合之间是没有交集的,因而我们在一种组合上修改了布局之后,在另一种组合上不会被修改,也不会影响别的布局,甚至我们可以为特定的组合添加新的UI组件,新增的不会在没有交集的组合中出现
(这也是为什么我们强调首先要在[AA]组合中添加其他三种组合中都使用到的共同的组件,如果在其他组合中添加,那么在其他组合中它很有可能就显示不出来。),利用这一特性,我们在布局的时候可以更灵活的做更多的事情。
布局我们的页面
根据上一节分析的内容,我们我们需要分四步完成我们的三种sizeclass组合的布局工作:
1. 在[AA]组合中添加好所有共同的
UI组件
button和
view;
布局[CR];
布局[AC];
布局[RR];
到目前为止,我们就完成了预期的目标:同时支持iPhone和iPad的横竖屏操作,并且为每一种设备的每一种朝向都定义好了我们预期的布局效果。
小结
sizeclass为一个ViewController适配多个设备、多种屏幕提供了解决途径,能够在尽量提高代码复用性的前提下给用户更多、更合适的展示效果,这种适配虽然有些繁琐(你要为预期实现的每一种
sizeclass组合都要分别布局),但毕竟一翻折腾之后,还是能够实现自己想要的效果的。
Xcode7中对sizeclass的要求更为严格,我们在定义自己的
sizeclass组合的时候一定注意不同组合之间不能有交集,否则会出现布局的相互覆盖,造成布局的混乱和失败。
对于
sizeclass的紧凑Compact、正常Regular和任意Any,要有透彻的理解,每种设备的横竖屏分别对应什么组合,只有清楚了这些,在使用
sizeclass的时候才能游刃有余!
建议在产品开发初期就标记好一个
ViewController支持哪些布局效果,做好文档留存,便于APP的后期维护。
转载自:/article/3643435.html
相关文章推荐
- C++学习笔记29,引用变量(1)
- 计算机视觉的一些算法实现资源 Computer Vision Algorithm Implementations
- openstack之dashboard与cinder(一)
- 指针与数组,指针与函数,指针与字符串
- mongodb启动失败解决方案
- SGU 538. Emoticons 水题
- 在Dreamweaver中安装Emmet(zen-coding)
- C++成员变量的初始化顺序问题
- hdu 1711 Number Sequence(KMP入门模板题)
- Qt5 取消了QTextCodec::setCodecForTr()和QTextCodec::setCodecForCString()这两个函数。
- 状态模式
- 5 Maven-依赖详解
- org.hibernate.PersistentObjectException: detached entity passed to persist
- 软考嵌入式系统工程师知识点整理(嵌入式操作系统)
- Android如何自定义MaterialDesign主题
- Windows 10 UWP/Windows 10 Mobile 的微博分享实现
- 使用pssh进行并行批量操作
- Linux统计文件个数
- 五分钟法则(five minute rules)
- 多态、Object