iOS应用开发中使用Auto Layout来适配不同屏幕尺寸


简介
Auto Layout 是苹果在 Xcode 5 (iOS 6) 中新引入的布局方式,旨在解决 3.5 寸和 4 寸屏幕的适配问题。屏幕适配工作在 iPhone 6 及 plus 发布以后变得更加重要,而且以往的“笨办法”的工作量大幅增加,所以很多人开始学习使用 Auto Layout 技术。

初体验
0. 开发环境

本系列文章的开发环境为:

OS X 10.10.3
Xcode Version 6.3.1 (6D1002)
1. 新建应用

新建一个 Single View Application,命名为 AutoLayout,如下:

点击选中 Main.storyboard,右侧内容如下:

两个按钮将会在未来的开发中产生巨大的作用,他们将拥有本系列文章的全局名称:按钮1,按钮2。请先记下他们的位置。

2. 直接上手,开始使用

这也是我对学习新的软件编程技术的基本学习方法:有一个具体客观驱动的目标,例如做一个真正要给客户用的软件,而不是“为了学习新技术提高自己”这类伪目标。

让我们直接上手:绘制一个距离左右边都有一定距离、固定高度、垂直居中的按钮,叫“Swift on iOS”。

第一步,从右侧拖过来一个按钮,置于页面最中间。会有参考线出现,这一步很容易:

选中这个 button,将按钮背景色和前景色进行如下设置: 

将按钮左侧边界往左拖动直到自动吸附,留下一定的距离。右侧进行同样操作: 

选中这个 button,修改文字为 Swift on iOS: 

选中这个 button,点击 按钮2 ,选择这一项: 

这时候 button 周围会出现一些蓝色的线条,这些就是 Auto Layout 的约束项。

3. 大功告成,查看效果
3.5寸: 

4寸: 

4.7寸: 

5.5寸:

4. 分析
选中这个 button,在右侧查看自动生成的约束项: 

只有三项,这三项的意思分别是:和父视图纵向居中对齐、右侧和父视图对齐、左侧和父视图对齐。

我们很容易就能理解这样可以定位一个按钮,但是总感觉少了点什么。实际上这三个自动生成的约束项并不能描述一个 button 的位置,因为少了一个关键的属性:button 的高度。以后我们会详细地讨论。

5. 核心思想
本质分析

Auto Layout 的本质是依靠 某几项约束条件 来达到对某一个元素的定位。我们可以在某个地方只使用一个约束,以达到一个小目的,例如防止内容遮盖、防止边界溢出等。但我的最佳实践证明,如果把页面上每一个元素的位置都用 Auto Layout 进行 “严格约束” 的话,那么 Auto Layout 可以帮我们省去非常多的计算 frame 的代码。

“严格约束” 是什么?

简单来说,严格约束就是对某一个元素的绝对定位,让它在任一屏幕尺寸下都有着唯一的位置。这里的绝对定位不是定死的位置,而是对一个元素 完善的约束条件。

让我们看图说话:

我们要在一个直角坐标系里描述一个矩形。
那么只需要指定这个矩形的位置和大小。
那么只要给出上图中的四个值即可:到左边界的距离,到上边界的距离,宽度,高度。
这四个约束是最简单的情况。在对一个元素进行严格约束时,请直接在脑中构建这个元素,并且加上几条约束条件,如果他无法缩放和动弹,那么严格约束就是成功的!
必须牢记,使用 Auto Layout 时最重要的是:对页面上每一个元素都进行严格约束,不严格的约束是万恶之源。

6.实现三等分
三等分设计思路

许多人刚开始接触 Auto Layout,可能会以为它只能实现上面的1、2功能,其实后面3、4两个功能才是强大、特别的地方。接下来我们将尝试设计横向三等分:

第一个元素距离左边一定距离。
最后一个元素距离右边一定距离。
三者高度恒定,宽度相等。(此处我们设置为高度恒定(height 属性),如果你需要的是固定长宽比,则需要设定 Aspect Ratio 属性)
1和2、2和3的横向间距固定。
干货,实现过程的动图:

运行结果

4 寸:

4.7 寸:

纵向三等分实现方式类似,大家可以自己尝试一下哦~



相关阅读:
jQuery多项选项卡的实现思路附样式及代码
DBA应该知道的一些关于SQL Server跟踪标记的使用
js获取本机操作系统类型的两种方法
HTML5 Canvas实现文本对齐的方法总结
Jersey框架的统一异常处理机制分析
win10隐藏图标后找不到怎么办?win10隐藏图标后如何找出来
Win10正式版10586.104更新了什么?Win10正式版10586.104更新内容汇总(不断更新中)
全面了解MySql中的事务
win10不是完全免费 仅限Win7/8.1用户第一年内免费升级
PHP中的替代语法简介
Windows系统怎么添加Ubuntu启动项?
php调用nginx的mod_zip模块打包ZIP文件
做好七件事帮你提升jQuery的性能
jQuery使用$.ajax进行即时验证的方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 武夷山-西安 宋-高台子 南观村-塔崖驿 重庆-德惠 百色-平果 浩良河-大庆 新立屯-塘沽 包头东-德清西 西宁-滕州 高头-西岗子 门源-临泽南 大兴-经棚 株洲-西平 绣峰-大杨树 南丰-宁德 新和-喀什 柳毛沟-影壁山 太原-乌鲁木齐 岩山-库都尔 石家庄北-保定 兴城-三门峡西 紫荆关-野三坡 三关口-长农 海林-泰康 莲花山-元宝山 桃园-南桥 团结-呼兰 昭通-滥坝 清水-兴平 东安东-潍坊 潍坊-十堰 遵义-关林 泉阳-吴家屯 沈阳北-贵阳 四平-东丰 郑州-杨陵 龙山镇-泉州 玉泉-赵光 南昌-铁力 哈尔滨-新华 哈密-渑池 塘沽-铁岭 青州市-锦州南 诸暨-漯河 带岭-朗乡 三门峡西-苏州 玉门-金昌 合肥南-武夷山北 怀化-徐州 兴平-镇平 汇流河-吉文 熊岳城-葛根庙 西宁-成都 塔源-塔河 宁安-佳木斯 临海-冠豸山 新帐房-光明 肇庆东-三水南 二龙山屯-沙园 吕梁-静海 大连-郭家店 绥德-北碚 太原东-怀仁 普洱渡-彝良南 定陶-诸暨 富源-昆明 秦皇岛-鞍山西 阿龙山-岭北 化德-鞍山 吉林-绍兴 民权-信丰 公主岭-巩义 海拉尔-桑根达来 泉阳-十里坪 交城-疏勒河 好鲁库-哲里木 宜兴-弋阳 衡山西-孝感北 贵定-广州 邯郸-霸州 什川桃园
从武汉到佛山几点的列车火车。票价是多少
急泰州汽车南站到泰兴的时刻表最后一班是几点啊
天津至河南省方城县柳河乡关沟村北城庄的最近行车路线
暑假想去福建南平武夷山旅游求详细路线
从兰州去石河子请问坐西安到奎屯的火车列车近,还是坐兰州到乌
8月30日晚从南昌飞往上海的飞机是否停靠杭州
赤峰至鞍山怎么坐车省钱?来回多少钱
台州临海到成都的交通方法
家嘴去浦东机场什么办法最便宜,而且可以在两个半小时内到
能在许昌买郑州火车列车站到成都的票吗
从吉林江北火车列车站到吉林市船营区第二十五小学怎么乘车
巫溪到重庆的客车一天有几班?几点发车可以提前买吗
K8082到钟祥站的时间
三门峡至许昌的客车票价是多少
求从合肥到丽江华坪最佳线路
大连火车列车站前的韩城一年租金多少
南通到上海市国定路309号怎么走(自驾车)
上海到大连客车是否经过熊岳城
谁详细介绍一下从上海出版印刷高等专科学校到上海列车火车站做地
巴南区小南海水电站2011是否要建
哪个快递公司从东莞到桂林寄50K以上的价格最便宜
想知道: 桓台县 桓台汽车客车站到桓台教体局公交线路的信息
请问广东肇庆火车站坐火车到东东莞东火车站或东莞火车
珠海哪里可以卖到魅族m8手机
从重庆到长沙开客车汽车最方便的路线是什么,希望越详细越好?
绍兴到富阳在那个站坐车购票
广州飞到长春的打折机票
学大车要几岁啊,近视可以学吗
我在成都高升桥住,请问我自驾车去金堂县城线路怎么坐车谢谢

Copyright © 2016 phpStudy |