Auto Layout - 使用总结
1、要开始使用AutoLayout,请先设置要约束的view的translatesAutoresizingMaskIntoConstraints属性为NO。在xib或者sb中勾选Use Auto Layout,那么所有在xib或者sb中出现的view都已经默认将translatesAutoresizingMaskIntoConstraints设置为NO。
self.view.translatesAutoresizingMaskIntoConstraints = NO; // self.view 代表 所有你要添加约束的view

2、在使用AutoLayout布局的view中,代码中避免出现设置其frame相关属性(如center)的代码,但是可以获取其frame;
3、通过代码为xib或sb中view增加约束时,尽量避免在viewDidLoad中执行,最好放在updateViewConstraints[UIViewController]或者updateConstraints[UIView]中,记得调用[super updateViewConstraints]或者[super updateConstraints];
- (void)updateViewConstraints
{
// 在这里为你的view添加约束,请确保该view的translatesAutoresizingMaskIntoConstraints属性已设置为NO
[super updateViewConstraints];
}
如果你真的写在viewDidLoad里了,那么可能会遇到这种崩溃错误
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Impossible to set up layout with view hierarchy unprepared for constraint.'
4、设置UIScrollView内部的子控件相对于UIScrollView的约束时,该约束只会影响UIScrollView的contentsize计算,并不会影响UIScrollView的size。
按照下图中的视图结构为UIScrollView添加container,然后将所有的子控件添加到container中

① 设置scroll view相对于其父控件的约束 - 保证scrollview的正确位置和大小
② 设置container相对于scroll view的约束 - 一般情况下为container距离scrollview的trailing/leading/top/bottom均为0。这样scrollview会通过该约束和container的大小来计算contentsize
③ 向container中添加子控件,并约束container的宽度和高度适应子控件
如果想设置container为固定宽度且与控制器view的宽度相等,在这种情况下可以使用代码进行设置container相对于self.view的leading/trailing为0。
- (void)updateViewConstraints
{
NSLayoutConstraint *sctLeading = [NSLayoutConstraint constraintWithItem:_container attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:];
NSLayoutConstraint *cstTrailing = [NSLayoutConstraint constraintWithItem:_container attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:]; [self.view addConstraints:@[cstTrailing, sctLeading]]; [super updateViewConstraints];
}
5、在AutoLayout中设置固定数量view等间距分布的简单方法
以水平方向为例,依次添加视图[space 表示 用透明视图占据间隙位置]
space1-view1-space2-view2-space3-view3-space4
设置space leading = super.leading + 0 / space4.trailing = super.trailing + 0 4个space等宽,高度可随意设置[但不能不设置] 所有view宽度相同即可。
该方式比普通的直接拖3个view,然后依次添加约束要简单快捷许多,而且在数量较少的情况下对性能几乎没有影响。
6、如果需要在控制器中动态添加或者移除视图,在控制器中为新添加的视图增加约束,在updateViewConstrains中实现,然后调用[super updateViewConstrains];同理,在view中动态添加或者移除视图,在updateConstrains中实现,然后调用[super updateConstrains]
7、控制器在其view需要重新布局时会执行以下过程:
① 控制器的视图调整到新的尺寸 - 控制器会根据当前状态栏、导航条等其它因素的状态来调整其view的位置尺寸
② 如果没有使用autolayout,所有子视图会根据autoresizeing mask调整
③ 调用viewWillLayoutSubviews
④ 调用控制器视图的layoutSubviews,如果是使用autolayout,则会调用updateViewConstrains -> 该方法的实现会调用所有子视图的updateConstraints -> 更新完约束之后,所有视图会根据计算出来的新的布局更新位置
⑤ 调用控制器的viewDidLayoutSubviews
如对以上内容有疑问,欢迎留言讨论。转载请注明出处:博客园 @bbqe http://www.cnblogs.com/liufeng24/
Auto Layout - 使用总结的更多相关文章
- 【Auto Layout】Xcode6及以上版本,创建Auto Layout 约束时产生的一些变化【iOS开发教程】
[#Auto Layout#]Xcode6创建Auto Layout 约束时产生的一些变化 通过两个小Demo来展示下变化: Demo1需求: 为控制器的根视图(图中的“控制器View”)的子 ...
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
http://blog.csdn.net/pucker/article/details/41843511 上一篇文章<iOS 8界面自动布局系列-1>简要介绍了iOS界面布局方式的前世今生 ...
- 手写代码自动实现自动布局,即Auto Layout的使用
手写代码自动实现自动布局,即Auto Layout的使用,有需要的朋友可以参考下. 这里要注意几点: 对子视图的约束,若是基于父视图,要通过父视图去添加约束. 对子视图进行自动布局调整,首先对UIVi ...
- Auto Layout
Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局【转】
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- 转载自@机智的新手:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- ios auto layout demystified (二)
Constraints Constraint Types Layout constraints (NSLayoutConstraint class, public)—这些规则指定了view的几何学.他 ...
- ios auto layout demystified (一)
Ambiguous Layout 在开发过程中,你可以通过调用hasAmbiguousLayout 来测试你的view约束是否足够的.这个会返回boolean值.如果有一个不同的frame就会返回ye ...
- iOS Auto Layout
Auto Layout是什么 Auto Layout是一个基于constraint(约束)的布局系统,它根据UI元素之间约束关系来调整UI元素的位置和大小. Auto Layout解决什么问题 更容易 ...
- WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性
目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...
随机推荐
- set_exception_handler 和 set_error_handler 函数
定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 nul ...
- Java数字处理
给出一个不多于5位的正整数,要求如下: (1)求出该数是几位数. (2)分别打印出每一位数字. (3)按照逆序打印出各位数值. 按照以上要求,首先得用户从键盘输入一个不多于5位的正整数,可以用Syst ...
- shell脚本调用spark-sql
为了更方便的查询并产生报表, 需要使用shell脚本调用spark-sql spark/bin/spark-sql --master spark://host:7077 -f ${SQL_FILE} ...
- 6.python字符串-内置方法列举
所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...
- 常用的PC/SC接口函数
PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,PC/SC规范建立在工业标准 ...
- OpenStack: 安装准备
>安装准备1. 安装MySQL# apt-get install python-mysqldb mysql-server将/etc/mysql/my.cnf修改bind-address为&quo ...
- Mysql 更改最大连接数
方法一: 进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MyS ...
- iOS学习之UIControl
一.UIControl初识 1.UIControl是有控制功能的视图(比如UIButton.UISlider.UISegmentedControl等)的父类. 只要跟控制有关的控件都是继承于 ...
- 在ASP.NET中实现OAuth2.0(二)之打造自己的API安全策略
1.场景介绍 公司开发了一款APP产品,前期提供的api接口都是裸奔状态 举个例子:想要获取某一个用户的数据,只需要传递该用户的ID就可以拿走数据(说多了都是泪) 现在想给这些接口穿个衣服,加个壳(对 ...
- .Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(二)级联删除和触发器
1.建立级联删除 Mr.E的级联删除并非数据库自带那个级联删除,而是Mr.E自带的,所以它能触发你C#里面编写的触发器. 首先,建立级联删除关系,如下图有两个表,UserInfo和UserDocume ...