引言:

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 plaincopy
  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 plaincopy
  1. //创建需要参与约束规则的对象字典 <span style="font-family:Arial,Helvetica,sans-serif">表示这三个Button将参与Autolayout的约束处理</span>
  2. NSDictionary *viewsDic = NSDictionaryOfVariableBindings(deleteButton,cancelButton,nextButton);
  3. NSArray *constraints = nil;
  4. constraints = [NSLayoutConstraint constraintsWithVisualFormat:
  5. @"H:|-25-[deleteButton(==cancelButton@700)]-(>=8)-[cancelButton(140)]-[nextButton(nextButtonWidth)]-rectY-|"//水平 可视化格式语言
  6. options:NSLayoutFormatAlignAllTop //对齐功能
  7. metrics:@{@"rectY":@5,@"nextButtonWidth":@30}//指标参数
  8. views:viewsDic];//参与约束的对象字典
  9. [self.view addConstraints:constraints];
  10. constraints = [NSLayoutConstraint constraintsWithVisualFormat:
  11. @"V:[nextButton]-|" //垂直 可视化格式语言
  12. options:0 //无条件
  13. metrics:nil//不带指标参数
  14. views:viewsDic];//参与约束的对象字典
  15. [self.view addConstraints:constraints];
  16. //    [deleteButton setContentHuggingPriority:249 forAxis:UILayoutConstraintAxisHorizontal];

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

横屏:

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

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

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

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

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

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

6:调试:

看懂IB给出的警告:

通过代码来检测 模凌两可的布局:

总结:

转载于:https://www.cnblogs.com/zsw-1993/p/4879350.html

ios8来了,屏幕更大,准备好使用 iOS Auto Layout了吗?相关推荐

  1. # 2021-01-13 #「FVWM」- 虚拟桌面(让你桌面比屏幕更大)

    在FVWM中,为用户提供了「虚拟桌面」的功能. 什么是「虚拟桌面」? 「屏幕」是在一个「桌面」上的一个视口,「桌面」可能大于「屏幕」. 可以访问多个不同的「桌面」(概念:当「视图」应用程序不同时,每个 ...

  2. 除了后置三摄 新一代iPhone屏幕更大机身更薄...

    最近关于苹果的爆料开始频繁起来,现在有最新消息,有外媒再次带来了关于新一代iPhone的细节信息. 据曾多次准确预测出苹果产品主要信息的Macotakara的最新报道,iPhone XI的屏幕尺寸将从 ...

  3. android大屏适配_大屏开创者三星Note系列,也要被更大屏的折叠屏手机取代了

    临近年关,各个手机厂商们的旗舰产品也都发布的差不多了,发布会数量也在逐渐减少,紧随而来的就是一年一度的手机曝光大赛了,关于明年旗舰产品的信息也开始逐渐浮出水面. 其中一条关于三星旗舰的曝光信息则比较特 ...

  4. 屏幕小于6英寸的手机_6英寸屏幕真的大么?你可能对“全面屏”有什么误解!详解全面屏手机那些事...

    6英寸屏幕真的大么?你可能对"全面屏"有什么误解!详解全面屏手机那些事 2018-05-15 10:31:35 225点赞 278收藏 118评论 小编注:想获得更多专属福利吗?金 ...

  5. 为什么旗舰智能手机屏幕越来越大

    自从2007年苹果发布第一代iPhone以来,苹果手机已经发展到第五代,从手机屏幕来看存在一个规律,那就是屏幕尺寸在逐渐变大,iPhone3GS和iPhone4系列都是3.5英寸,iPhone5系列都 ...

  6. 爆料称配备更大屏幕尺寸的Apple Silicon版iMac仍在研发中

    7月12日消息,据国外媒体报道,外媒记者爆料称,一款配备更大屏幕尺寸的Apple Silicon版iMac仍在研发中,这款iMac将取代搭载英特尔处理器27英寸iMac. 根据他的说法,这款产品可能采 ...

  7. 电视机当计算机屏幕,电视机能当显示器吗?电视机是更大更便宜 但真的做不了显示器...

    [PConline 科普1分钟]作为编辑,我们其实一直都很注重网友在文章下方的留言.最近我在文章下方发现有网友留言类似"电视机又大,价格还便宜用电视机当电脑显示器更舒服"的说法.但 ...

  8. 屏幕显示密度dpi_华为mate7——修改 DPI 屏幕密度 !可使屏幕在视觉上变得更大...

    本帖最后由 丶浩南丶 于 2015-6-5 18:36 编辑 7eed1eeb1ec25a2f7c2eba32caac659a8147.jpg (99.56 KB, 下载次数: 106) 2015-6 ...

  9. 大屏幕和折叠屏: 让您的 Android 游戏登上更大的舞台

    作者 / Ben Gable, Partner Developer Advocate 让我们继续<让您的应用适配更多屏幕>中的话题,不过今天会更专注于游戏的范畴.在不久前的 GDC 上,我 ...

  10. 传5G版iPhone SE将配双镜头摄像头并配备更大屏幕

    最新传闻称,苹果可能要到2022年才会发布新款5G版iPhone SE,配备双镜头摄像头,并配备更大屏幕.此外,iPhone 13将采用Promotion屏幕. 显示器专家Ross Young最新爆料 ...

最新文章

  1. mysql源码安装都能装什么模块_源码安装后,添加其他模块
  2. 反思脑机接口技术:机器真的能控制我们的大脑吗?
  3. 兴趣部落的 Git 迁移实践
  4. linux怎么测试磁盘读写,怎样测试Linux磁盘的读写速率
  5. SAP Cloud for Customer Price-计价简介 1
  6. C - Insertion Sort Gym - 101955C(2018icpc沈阳/打表找规律)
  7. 在PHP中实现中文汉字验证码
  8. 2010计算机知识点总结,2010年全国职称计算机考试:知识点笔记第一章
  9. 随机生成指定个数学生的语文数学外语成绩并求平均值
  10. 微软前WP主管乔北峰长假回归 新岗位或将得罪不少用户
  11. 光头强的圆球机器人视频_《熊出没狂野大陆》快上映了,看了多年光头强,还能有新鲜动画吗...
  12. 海贝思蓝牙接收器Linux,Hagibis海备思 蓝牙音频接收 耳机怎么样,评测
  13. 模拟器android_id,夜神模拟器链接Android studoid
  14. 数字绘画技术,从数位板到数位屏
  15. 2048小游戏项目总结
  16. 关于a标签的基本用法和特殊用法
  17. 高盛:Juniper市场表现将超过Cisco、Arista
  18. 酒美网宣布完成B轮融资 投资方或为罗斯柴尔德家族
  19. crash report
  20. Androidstudio 最权威使用技巧, 持续更新

热门文章

  1. URL跳转与webview安全浅谈
  2. 传统城域网架构遇瓶颈 引入NFV成有效解法
  3. 网站流量少的原因及解决方案
  4. python第三方模块
  5. Linux下的SYN flood***
  6. linux常用命令(3)——系统管理1
  7. 实体框架 6.0:异步、IQueryable操作符和特性改进
  8. php学习的一些笔记
  9. TurboFan的故事
  10. Spark streaming消费Kafka的正确姿势