1:理解概念

Auto Layout 中文翻译过来意思是 自动布局 ,通过内定的 Constraint (约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图.

将我们想象中的结果展现出来. Constraint 的设定非常灵活,实现一种布局的方法可以通过多Constraint 套来完成.

以下几点是我们在开始使用之前必须弄清楚的事情:

1:我们要抛弃以往旧的布局方式不再去关注View的Frame,Center,和autoresizing. 因为这些坐标和大小的定位都可以通过来Auto Layout完成.

2:理解每一种 Constraint 的含义,否则,当你去看别人的实现的 Constraint 时,就会有种看天书的感觉.

3:按意图设计,一切按我们理想中的效果去布局,只要约束设定的合理,就一定能够完成目标布局.

2:开始使用

先从 Interface Builder 开始吧. 打开某个 Xib 或者 StoryBoard ,

在右侧 Show in file inspector 里面找到 Ues Autolayout ,将其勾选.如下图:

自此, Autolayout 便启用成功, autoresizingMask 被废弃.其所有以往的功能和特性都被Autolayout 取代.

现在我们定位控件位置的 方式 ,不再像以前一样, 计算 好每一个控件具体的位置,x是多少,y是多少.

而是思考,这个控件离左边是相隔多少距离,或者离顶部或底部相隔多少距离.

而有些规则性的事情还是类似的,比如我们定位一个控制的位置,一定要有x,y两个坐标点同时有值,少一个都不能正常显示.

同样 Autolayout 在创建约束时也一样,在思考完离顶部距离以后,还需要思考离顶部距离,否则控件的显示位置一样无法正常显示.

换言之,要让 Autolayout 计算出合理的位置,需要保证 水平 距离和 垂直 距离同时存在. 否则IDE,都会给出警告,提示这样的布局 Ambiguous Layout (模凌两可)

接下来,让我们来熟悉一下 Interface Builder 提供哪些实现 Autolayout 的功能:

观察一下界面预览右下角,有一排如下图这样的按钮:

这些是 Interface Builder 用来创建 Constraint 的主要方式,同时,我们也可以在 Xcode 的菜单栏中找到这些功能,如下图:

这些功能分别如下图中描述的那样:

如果是从代码层面开始使用Autolayout,需要对使用的View的translatesAutoresizingMaskIntoConstraints 的属性设置为NO.

即可开始通过代码添加Constraint,否则View还是会按照以往的autoresizingMask进行计算.

而在 Interface Builder 中勾选了Ues Autolayout,IB生成的控件的translatesAutoresizingMaskIntoConstraints 属性都会被默认设置NO.

3:从旧的IB布局中转换成Auto layout

4:熟练使用Interface Builder

5:通过代码来构建自动布局

代码创建的约束有两种方式:

1:常规约束,写法非常冗长,但能实现所有的约束方式以及非常特殊的约束方式,代码如下:

    //添加两个允许自动布局的子视图
UIView *view1 = [[UIView alloc]initWithFrame:CGRectZero];
//使用Autolayout,关闭Autorisizing
view1.translatesAutoresizingMaskIntoConstraints = NO;
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1]; UIView *view2 = [UIView new];
view2.frame = CGRectZero;
view2.translatesAutoresizingMaskIntoConstraints = NO;
view2.backgroundColor = [UIColor grayColor];
[self.view addSubview:view2];
/**
* 第一种简单方法
*/
//设置子视图的宽度和父视图的宽度相同
// [self.view addConstraint:
// //添加一个约束
// [NSLayoutConstraint constraintWithItem:
// //给谁添加约束(view1)
// view1 attribute:
// //约束的属性是宽
// NSLayoutAttributeWidth relatedBy:
// //约束的关系是怎样的,相等,还是大于小于
// NSLayoutRelationEqual toItem:
// //和谁建立约束关系(父视图)
// self.view attribute:
// //和父视图的哪个属性建立
// NSLayoutAttributeWidth multiplier:
// //比例
// 1.0 constant:
// //约束的值
// -100]];
//“view1.attr1 = view2.attr2 * multiplier + constant” //设置子视图的高度是父视图高度的一半
// [self.view addConstraint:[NSLayoutConstraint
constraintWithItem:view1
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:0.5
constant:-
]
]; //////////////////////////////////////////////////////////////////////////////////////// #import "DDYViewController.h"
#define SCREENW [UIScreen mainScreen].bounds.size.width
#define SCREENH [UIScreen mainScreen].bounds.size.height @interface DDYViewController () @property (nonatomic, weak)UITextField *loginName; @end @implementation DDYViewController - (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = [UIColor lightGrayColor]; //imageView 背景图片
[self settingImageView]; //texdField 文本框
[self settingTextField]; } #pragma mark - texdField
- (void)settingTextField
{
//创建组件
UITextField *loginName = [[UITextField alloc]init]; //设置frame,约束完删除
//loginName.frame = CGRectMake(10, 10, 100, 30); //用autolayout
loginName.translatesAutoresizingMaskIntoConstraints = NO; //文本颜色
loginName.textColor = [UIColor blueColor]; //背景颜色
loginName.backgroundColor = [UIColor whiteColor]; //默认显示
loginName.placeholder = @"password"; //样式
[loginName setBorderStyle:UITextBorderStyleRoundedRect]; //全局
_loginName = loginName; //添加组件
[self.view addSubview:loginName]; /* 约束 */
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:loginName
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:
constant:
]
]; [self.view addConstraint:[NSLayoutConstraint
constraintWithItem:loginName
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:
constant:
]
];
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:loginName
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:
constant:
]
];
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:loginName
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:
constant:
]
];
} #pragma mark - imageView
- (void)settingImageView {
//创建组件
UIImageView *backImageView = [[UIImageView alloc]init]; //背景色,无背景图片时可用
//backImageView.backgroundColor = [UIColor grayColor]; //背景图片
backImageView.image = [UIImage imageNamed:@"form-big"]; //开启用户交互,往其上添加可交互组件时开启
//backImageView.userInteractionEnabled = YES; //添加组价
[self.view addSubview:backImageView]; //使用autolayout
backImageView.translatesAutoresizingMaskIntoConstraints = NO; /* 约束 */
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:backImageView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:
constant:
]
]; [self.view addConstraint:[NSLayoutConstraint
constraintWithItem:backImageView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:
constant:
]
];
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:backImageView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:
constant:
]
];
[self.view addConstraint:[NSLayoutConstraint
constraintWithItem:backImageView
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:
constant:
]
];
}

 

item1.attribute = multiplier ⨉ item2.attribute + constant

2:可视化格式语言约束VFL

    /**
* 第二种方法
*/
//NSDictionaryOfVariableBindings是一个宏定义,期作用是生成一个字典,key的名字和对象的名字标示符相同,比如{@“self.view”:self.view ,@“view1”:view1,@“view2”:view2},一般字典里包含需要自动布局的父视图和所有的子视图
NSDictionary *views = NSDictionaryOfVariableBindings(self.view,view1,view2); [self.view addConstraints:
//添加一组约束
[NSLayoutConstraint constraintsWithVisualFormat:
//添加对水平方向上V1的控制:距离父视图左边距为0(如果是0可以忽略),同时view2的宽度和viwe1相同
@“H:|--[view1]--[view2(==view1)]--|” options:
//字典类型的值,可以点进去看枚举类型,一般给0
metrics:
//衡量标准,一般为nil,参数从NSDictionary传过来
nil views:views]]; // [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@“V:|-100-[view1]-100-|” options:0 metrics:nil views:views]];
// [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@“V:|-100-[view2]-100-|” options:0 metrics:nil views:views]]; //添加垂直方向view1的控制:距离父视图顶部距离为0;同时viwe2的高度和view1相等
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@“V:|--[view1]--[view2(==view1)]--|” options: metrics:nil views:views]];

自动布局AutoLayout的更多相关文章

  1. Xcode6中自动布局autolayout和sizeclass的使用

    Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

  2. (转)Xcode6中自动布局autolayout和sizeclass的使用

    Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

  3. iOS:自动布局Autolayout

    自动布局:Autolayout 简介: 在以前的iOS程序中,是如何设置布局UI界面的? 经常编写大量的坐标计算代码 为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还 ...

  4. 自动布局autolayout和sizeclass的使用

    一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对 ...

  5. iOS 自动布局 Autolayout 优先级的使用

    一.约束的优先级 0.屏幕适配 发展历程 代码计算frame -> autoreszing(父控件和子控件的关系) -> autolayout(任何控件都可以产生关系) -> siz ...

  6. IOS手动添加的View 在代码中使用(自动布局)autoLayout

    - (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonType ...

  7. iOS-自动布局Autolayout(原创)

    前言 基础知识 在一定情况下我们需要用到自动布局(autolayout) 这样我们就能使视图与视图之间的位置相互关联起来 横向:距离父视图左侧100 视图本身的宽度最小是100 距离父视图右侧是100 ...

  8. 【转】iOS学习之Storyboard中的UIScrollView使用自动布局

    在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout 结合使用,相对来说有点复杂.根据实践,我说一 ...

  9. AutoLayout +Masonary

    1, Masonry介绍与使用实践(快速上手Autolayout) http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayou ...

随机推荐

  1. iOS 地图坐标系之间的转换WGS-84世界标准坐标、GCJ-02中国国测局(火星坐标,高德地图)、BD-09百度坐标系转换

    开发过程中遇到地图定位不准确,存在偏差.首先确认你获取到的坐标所在坐标系跟地图数据是不是相匹配的. 常用的地图SDK:高德地图使用的是GCJ-02(也就是火星坐标系),百度使用的是BD-09百度坐标系 ...

  2. CorAnimation7-高效绘图、图像IO以及图层性能

    高效绘图 软件绘图 术语绘图通常在Core Animation的上下文中指代软件绘图(意即:不由GPU协助的绘图).在iOS中,软件绘图通常是由Core Graphics框架完成来完成.但是,在一些必 ...

  3. C语言基础程序设计

    1 概论 程序(指令和数据的集合)在运行时,首先会被加载到内存(此时称为进程),然后由CPU通过控制器的译码从内存中读取指令,并按照指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再 ...

  4. JavaScript学习总结【2】、JS基础

    1.JS 命名规范 命名规范是很有必要的,可增强代码的可读性,一眼就能看懂要表达的意思,规范就是符合规则,使代码有利于后期维护,也能很大程度的提高开发效率.一个正常的网站有很多 JS 代码,如果在编写 ...

  5. 学渣也要搞 laravel(4)—— 服务 加解密篇

    使用 Crypt::encrypt() 对数据进行加密,[注意要引入 use Illuminate\Support\Facades\Crypt;; ] 简单的做个测试: 先分配一个路由: Route: ...

  6. linux系统下,递归删除.svn文件

    linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn"  | xargs rm -rf

  7. SpringMVC源码阅读(二)

    今天分析下ViewResolver和View的实现  下面是ModelAndView的实现 package org.springframework.web.servlet; import java.u ...

  8. MySQL查询统计,统计唯一值并分组

    做个笔记 SQLyog客户端访问MySQL服务器 统计数据:次数总数, 次数成功率,对象(obj)总数,对象(obj)成功率 要求:按时间排序和分组 sql语句如下: SELECT a.date AS ...

  9. [BZOJ 2186] [Sdoi2008] 沙拉公主的困惑 【欧拉函数】

    题目链接:BZOJ - 2186 题目分析 题目要求出 [1, n!] 中有多少数与 m! 互质.(m <= n) 那么在 [1, m!] 中有 phi(m!) 个数与 m! 互质,如果一个数 ...

  10. app内购提示,您已购买此商品,但未下载

    出现这样的问题,是支付没有finish造成的,一般在支付过程中断网了,下次再购买同一商品的时候就会出现这样的问题, 解决办法,在点击购买的时候判断支付队列中是否有为finish的商品,若有,则进行处理 ...