iOS学习之Autolayout
转载自:http://vit0.com/blog/2013/12/07/iosxue-xi-zhi-autolayout/
学习资料
文章
- Beginning Auto Layout Tutorial in iOS 7: Part 1
- Beginning Auto Layout Tutorial in iOS 7: Part 2
- Auto Layout Guide(官方)
前两篇文章对如何在xcode 5中使用autolayout讲得已经很详细了。我使用了一段时间autolayout的感觉是,一般情况下都可以通过xcode的ib上直接设置autolayout的各种属性完成项目需求,除非遇到需求比较复杂的布局。
官方的Auto Layout Guide讲得详细易懂,推荐
WWDC视频
2012
- 202 – Introduction to Auto Layout for iOS and OS X
- 228 – Best Practices for Mastering Auto Layout
- 232 – Auto Layout by Example
- 以及obj.io对这三个视频的总结
2013
一些学习到的知识点整理
用代码创建一个 NSLayoutConstraint
下面的方法遵循一个计算公式:
view1.attribute1
= multiplier × view2.attribute2 + constant
1 |
|
例子:
- Button.centerX = Superview.centerX
1 |
|
- Button.bottom = Superview.bottom –
1 |
|
创建完 NSLayoutConstraint 接下来要将它添加到 view 里,添加方法很简单,用 view 的-添加。但是应该添加到哪个 view 里呢?
(void)addConstraint:(NSLayoutConstraint *)constraint
兄弟 view 的 Constraint 添加到他们的 superview

两个 view 的父 view 是兄弟关系的,Constraint 添加到父 view 的 superview 上

如果两个 view 是 parent-child 关系,Constraint 添加到 parent view上

跨层级 view 之间的 Constraint
有如下的视图层级:
- View
- UIScrollView
- UISwitch
- UIButton
其中UISwitch相对 UIScrollView 水平居中,和 ScrollView 同一层级有一个 UIButton,现在要始终保持 UIButton 的水平中点位置和 UISwitch 的水平中点位置在同一条线上。
为 UISwitch 的水平居中 Constraint 建立一个 IBOutlet。
1 |
|
上面的的代码就实现了跨层级视图之间的 Constraint 设置。其实就是这么简单
设置Autolayout有两个原则
- Ambiguous Layout(The constraints must be suficient)
- Unsatisfiable Constraints(The constraints must not conflict)
在 IB 中设置明确的宽度
设置宽度有几个原则:
- 如果一个 View 的宽高在显示的时候是不确定的:让 view 根据内容改变大小(size to fit size)
- 如果一个 View 有确定的大小:改变其宽度的 Constraint Relation 为 >=
- 正确的设置Content Hugging Priority(内容压缩优先级) 与 Content
Compression Resistance Priority(内容抗压缩优先级)
Relation(Greater/Less) 与 Priority
Greater/Less 一般与 Priority 一起使用,为一个 Constraint 设置了 Greater/Less 后,调整 Priority。如果 Constraint 的 Priority 的值越大,程序优先设置它的 Constraint 效果。
如果两个 View 不在同一个层级,此时想要设置他们之间的 Constraint,只能通过代码实现。简单的方式是:先在 Xcode 中设置了 Constraint,然后为这个 Constraint 建立一个 IBOutlet,回到代码中,移除想要替换的 Constraint。
Content Hugging Priority 与 Content Compression Resistance Priority
含义:
- Content Hugging Priority(内容压缩优先级)
- Content Compression Resistance Priority(内容抗压缩优先级)。
如果 Constraint 发生冲突时,会先找优先级高的UIView,满足优先级高的UIView 的Constraint 后再依次找优先级低的 Constraint 满足,最后改变 View 的 Frame。如果发生多个 Constraint不能同时满足的情况,就发生了Unsatisfiable
Constraints的错误。
Visual Format Language
VFL(Visual Format Language),提供了一种让代码以一种可视化的方式来设置不同 views 之间的 Constraint。
1 |
|
Examples:
| Property | Examples |
|---|---|
| Inequality,Priority | [wideView(>=60@700)] |
| Vertical:Flush Views,Equal Heights | V:[redBox][yellowBox(==redBox)] |
| Combination | H:|–[Find]–[FindNext]–[FindField(>=20)]–| |

Constraint 在什么时候更新

UIView中
-setNeesdDisplay
-setNeedsLayout
-setNeedsUpdateConstraints
UIView/UIWindow中
-layoutIfNeeded
关于 intrinsicContentSize
在 UIView 中有个方法-intrinsicContentSize,用于指定一个
view 的 width 和 height,设置了-intrinsicContentSize相当于设置一个不可变的长度或者宽度。有点像
UISlider 只能设置宽度,不能设置高度那样。
Debug
在 Xcode 中,设置 Autolayout 时可能出现3种状态,分别会出现黄色、红色、蓝色的线或线框。
- 出现黄色的线或者线框表示:View 根据设置的 Constraints 最后计算出的 frame 位置和在xib 中 view 目前显示的位置不一致。此时并没有错误,只要更新一下
Update frames 以下就好 - 出现红色的线或者线框表示:出现了Ambiguous
Layout(Constraints 太少以至不能确定一个 view 的位置)或者Unsatisfiable Constraints(Constraints
有冲突,确定 view 一个方向上的 Constraints 超过1个)。这种情况要找到没有正确设置 Constraints 的 View 添加缺失的 Constraints 或者删除多余的 Constraints。 - 蓝色线条或者线框表示这个 view 的 Constraints 正确设置,并且 view 目前显示的位置和 Constraints 计算得出的最终位置是在同一个地方。
- 出现黄色的线或者线框表示:View 根据设置的 Constraints 最后计算出的 frame 位置和在xib 中 view 目前显示的位置不一致。此时并没有错误,只要更新一下
在代码添加 Constraints 的 Debug 方法。
- 在控制台输出AutolayoutTrace:
po。如果此时有Ambiguous Layout或Unsatisfiable
[[UIWindow keyWindow] _autolayoutTrace]
Constraints,可以在输出的代码中看到。
- 在控制台输出AutolayoutTrace:
有用的 debugging defaults
- 双倍的国际化字符串:
NSDoubleLocalizedStrings
YES - 显示视图的对齐框:
UIViewShowAlignmentRects
YES
- 双倍的国际化字符串:
AutoresizingMask自动转化成 Constraint
view有一个 translatesAutoresizingMaskIntoConstraints 属性,如果设置为 NO,那么在运行时,程序不会自动将AutoresizingMask转化成 Constraint。
Animation
关键是在 UIView Animation 中调用[view
layoutIfNeeded]
1 |
|
Github上一些好用的Autolayout第三方库
Comments
iOS学习之Autolayout的更多相关文章
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- 【转】iOS学习之Autolayout(代码添加约束) -- 不错不错
原文网址:http://www.cnblogs.com/HypeCheng/articles/4192154.html DECEMBER 07, 2013 学习资料 文章 Beginning Auto ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- iOS学习——UIView的研究
在iOS开发中,我们知道有一个共同的基类——NSObject,但是对于界面视图而言,UIView是非常重要的一个类,UIView是很多视图控件的基类,因此,对于UIView的学习闲的非常有必要.在iO ...
- ios 学习路线总结
学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...
- iOS学习-压缩图片(改变图片的宽高)
压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...
- 【原】iOS学习之事件处理的原理
在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...
- 【原】iOS学习47之第三方-FMDB
将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...
- 黑苹果-IOS学习的开始
深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...
随机推荐
- hdu 1572 全排列的搜索
好久没写搜索的题目了 复习一下/./ 这道题目是暴力的全排列#include<cstdio> #include<iostream> #include<cstring> ...
- 行内块和文字垂直对齐vertical-agign
vertical-align 垂直对齐 (对于块级元素无效,主要用来控制表单或者图片与文字对齐的) 图片和文字默认是基线对齐 属性: baseline 基线 top 顶线 middle 中线 bott ...
- selenium在爬虫中的应用之动态数据爬取
一.selenium概念 selenium 是一个基于浏览器自动化的模块 selenium爬虫之间的关联: 1.便捷的获取动态加载的数据 2.实现模拟登录 基本使用 pip install selen ...
- Innosetup设置控制面版中的名称显示和图标
//设置控制面板中程序图标UninstallDisplayIcon={app}\logo.ico //设置控制面板中程序的名称Uninstallable=yesUninstallDisplayName ...
- 转自:java 文件格式二进制头文件校验
转自:https://blog.csdn.net/useprogram/article/details/90637401public class FileTypeUtil { private fina ...
- Django 开发相关知识 整理
前言 前端ajax HTTP请求头 ajax上传文件 jsonp跨域 URL 设计 分发 url参数编码 反向生成url 视图 request对象 POST url信息 视图返回值 HttpRespo ...
- Redis使用总结-基础篇
年底的时候开始尝试在重构的项目中使用redis,现在项目稳定运行也有一段时间了,这里做一下阶段性总结. 一.简介 首先,redis是什么意思呢,官方文档的FAQ里给出了答案:It means REmo ...
- delphi xe5 fastreport4.14 中文很多时换行不正确
用一般的frxMEMOview 中文换行是瞎换,缺少数据,换成frxrichview 即可, frxrichview 使用注意点 1).Delphi中文很多时换行不正确 2).要在窗体上拖一个frxr ...
- PAT Basic 1087 有多少不同的值 (20 分)
当自然数 n 依次取 1.2.3.…….N 时,算式 ⌊ 有多少个不同的值?(注:⌊ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: 输入给出一个正整数 N(2). 输出 ...
- 域知识深入学习一:Active Directory 域服务
AD DS用来组织,管理,控制网络资源 1.1 Active Directory 域服务概述 AD内的directorydatabase(目录数据库)用来存储用户账户,计算机账户,打印机与共享文件 ...