自动布局AutoLayout

Auto Layout 是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应.

要完全掌握 Auto Layout 是一件非常消耗精力的事情,需要大量的实践,并且在根本上面,理解其如何使用,如果要全面的介绍 Auto Layout 和使用场景估计几篇博文都介绍不完,

本文希望能将使用 Auto Layout 的重点和技巧以及注意事项,进行一个介绍.成为学习 Auto Layout 的一个导航文章.

参考资料:

1:iOS7.0 Xcode5 Auto Layout 备忘录

http://www.cnblogs.com/thefeelingofsimple/p/3316300.html

2:iOS 6 Auto Layout NSLayoutConstraint 界面布局

http://www.devdiv.com/iOS_6_Auto_Layout_NSLayoutConstraint_%E7%95%8C%E9%9D%A2%E5%B8%83%E5%B1%80-weblog-227936-13173.html

3:iOS 6 新特性 Auto Layout

http://www.cocoachina.com/bbs/read.php?tid=116558

4:WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门

http://onevcat.com/2012/09/autoayout/

5:iOS 6 自动布局 入门-1

http://www.raywenderlich.com/zh-hans/22873/ios-6-%E8%87%AA%E5%8A%A8%E5%B8%83%E5%B1%80-%E5%85%A5%E9%97%A8%EF%BC%8D1

6:先进的自动布局工具箱

http://answerhuang.duapp.com/index.php/2013/10/11/%E5%85%88%E8%BF%9B%E7%9A%84%E8%87%AA%E5%8A%A8%E5%B8%83%E5%B1%80%E5%B7%A5%E5%85%B7%E7%AE%B1/

使用:

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:常规约束,写法非常冗长,但能实现所有的约束方式以及非常特殊的约束方式,代码如下:

[csharp] view plain copy

  1. //实例化Button
  2. button1 = [[UIButton alloc] initWithFrame:(CGRectZero)]; //这里不再需要去刻意指定x.y等坐标.
  3. [button1 setTitle:@ "yushuyi" forState:UIControlStateNormal];
  4. [button1 setBackgroundColor:[UIColor redColor]];
  5. [button1 sizeToFit];
  6. [button1 setTranslatesAutoresizingMaskIntoConstraints:NO]; //将使用AutoLayout的方式来布局
  7. [self.view addSubview:button1];
  8. //创建了一个水平居中父视图的约束
  9. NSLayoutConstraint *constraint = [
  10. NSLayoutConstraint
  11. constraintWithItem:button1
  12. attribute:NSLayoutAttributeCenterX
  13. relatedBy:NSLayoutRelationEqual
  14. toItem:self.view
  15. attribute:NSLayoutAttributeCenterX
  16. multiplier:1.0f
  17. constant:00.0f
  18. ];
  19. [self.view addConstraint:constraint]; //将约束添加到对应的父视图中
  20. //继续创建了一个位于父视图底部相隔20距离的约束
  21. constraint = [
  22. NSLayoutConstraint
  23. constraintWithItem:button1
  24. attribute:NSLayoutAttributeBottom
  25. relatedBy:NSLayoutRelationEqual
  26. toItem:self.view
  27. attribute:NSLayoutAttributeBottom
  28. multiplier:1.0f
  29. constant:-20.0f
  30. ];
  31. [self.view addConstraint:constraint];

值得注意的是,添加约束之前一定要将子视图优先addSubview到父视图中,否则在添加约束时会产生编译器警告.而我们在理解的时候,可以通过这种方式来理解.

item1.attribute = multiplier ? item2.attribute + constant

2:可视化格式语言约束

所谓可视化格式语言约束,是一种很直观的理解方式,当然,前提是你已经熟练理解这套语言的规则.

通过可视化语言可以一次性创建多个约束. 这对于第一次方式来说,是相当方面和容易理解的.但可视化语言不是所有约束都能满足.

我们可以用正则表达式的学习方式来学习这项可视化格式语言.举例代码如下:

[csharp] view plain copy

  1. NSDictionary *viewsDic = NSDictionaryOfVariableBindings(deleteButton,cancelButton,nextButton);
  2. NSArray *constraints = nil;
  3. constraints = [NSLayoutConstraint constraintsWithVisualFormat:
  4. @ "H:|-25-[deleteButton([email protected])]-(>=8)-[cancelButton(140)]-[nextButton(nextButtonWidth)]-rectY-|" //水平 可视化格式语言
  5. options:NSLayoutFormatAlignAllTop  //对齐功能
  6. metrics:@{@ "rectY":@5,@ "nextButtonWidth":@30} //指标参数
  7. views:viewsDic]; //参与约束的对象字典
  8. [self.view addConstraints:constraints];
  9. constraints = [NSLayoutConstraint constraintsWithVisualFormat:
  10. @ "V:[nextButton]-|"  //垂直 可视化格式语言
  11. options:0  //无条件
  12. metrics:nil //不带指标参数
  13. views:viewsDic]; //参与约束的对象字典
  14. [self.view addConstraints:constraints];

这简单的十行代码,如果你没有学习过Autolayout也会看出一些猫腻,似乎看懂了.但又似懂非懂.接下来就详细解释一下在解释之前,先看看上面这些代码执行后的效果,竖屏如下图:

横屏:

三个按钮位于视图的底部,有大有小,中间有间隔.

3:通过第三方Auto Layout的增强类别包,来实现约束的创建

https://github.com/smileyborg/UIView-AutoLayout

UIView-AutoLayout的出现如作者所说,其实现思路来源于Interface Builder. 所以在其API命名方面可以找到很多Interface Builder的影子,

博主极力推荐这个类库,通过它来创建约束是一件非常愉快的事情,思路清晰,当有个前提是,你已经理解了Auto Layout各项规则.

constraintsAffectingLayoutForAxis //约束检查 为什么这个View 这样显示

时间: 2024-10-30 01:51:36

自动布局AutoLayout的相关文章

自动布局(AutoLayout)使用

/*1. 创建控件,并添加到当前的View中*/ self.rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; self.rightButton.translatesAutoresizingMaskIntoConstraints = NO; [self.rightButton setTitle:@"RightButton" forState:UIControlStateNormal]; [self.view 

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

一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对独立的可视单元构成,这些可视单元有的主要负责向用户输出有用的信息,有些则负责信息的输 入(交互),交互的过程中往往还伴随有动画的效果,已达到整个信息传递的连贯性以及用户体验的细腻感.可视单元,在实际开发中主要是view. button等,那么这些可视单元的关系由两个基本的关系构成:兄弟关系和父子关系

自动布局autoLayout解决不同屏幕

这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程.这篇文章两个月前就想写下来,但因为一直工作较多,没有时间来完成.今天终于狠下心,丢下代码不写,来完成他吧! 一.别和我提Autolayout,我想死!! 从iOS6/xcode4开始,苹果开始提供了autolayout——一种对不同屏幕尺寸有更好兼容的自动布局机制,但我相信大多数人在刚接触autolayout时,一定和我一样,几乎快被其折

iOS学习之自动布局-Autolayout

Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.property2 * multiplier)+ constant value 解释:obj1的property1属性等于obj2的property2属性乘以multiplier(系数)再加constant(常量); 约束的优先级: 约束的priority属性表示约束的优先级,取值区间为[0,1000]

在storyboard/xib文件中实现自动布局 autolayout

1.注意事项 autolayout和frame属性是有冲突的,所以如果准备使用autolayout,就不要再代码中对控件的frame属性进行操作. 设置autolayout必须设置完全,必须包括位置信息和尺寸信息.也就是说必须有宽高和坐标位置,缺一不可. 回到顶部 2.简单示例 两个view(redView和blueView),等高等宽,redView距离左边和下边间距都是20,距离blueView间距也是20.blueView距离右边和下边都是20. 回到顶部 2.1.autolayout的相

自动布局autolayout使用总结(源码含swift版本)

一.概述 使用autolayout有一段时间了,Objective-C和swift下.iOS7和iOS8下都在用, 一路遇到了不少的坑,随遇随填,到今天也算是积累了不少经验了,这里总结一下, 通过自己新建的一个Doubi Demo来分享给大家.Doubi Demo我已上传到github上 去了(地址是:https://github.com/lihux/iLihuxAutoLayout),以后每篇文章的demo都 将放在github上,供大家参考.源码的workspace中有两个工程,分别使用OC

自动布局(autoLayout)演练2

那这一篇的练手的任务是: 如上图:红色记号代表间距都是20,两图片的高度都为40,最重要的一点:两图片的右边距(Trailing)对齐 1.添加两个uiview,我这是用的是storyboard拖的,两个uiview,设置好背景颜色 2.autoLayout与autosizing是重复的,不能混用,因此在xcode6.1以上要用autoLayout时,要在把zutosizing的勾去掉,要用autoLayout,把勾打上,因为这张图是xcode5.1,所以与xcode6不同 3.首先弄蓝色视图:

ios使用自动布局autolayout

在ios开发中经常用到自动布局,比如屏幕旋转来,界面就要从新摆放,不然就会显示不全. 自动布局一定要在storyboard界面里面设置,不能用纯代码的形式来写 要使用自动布局,首先要确保interface builder document里面的Use Auto Layout 和Use Size Classes 选项已经勾选??上了 图1:打开auto layout 这样在storyboard的右下角就会出现几个图形按钮:   分别是:stack.align.pin.和resolve auto l

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

- (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonTypeCustom];//不需要去刻意指定x,y的坐标,可以用CGRectZero btnTest.backgroundColor = [UIColor redColor]; btnTest.layer.borderColor = [UIColor yellowColor].CGColor; btnTes