昨天重点学习了下Autolayout,把以前没有吃透的概念重新理解了下,现在感觉整个人都是棒棒哒。

上一个项目是使用计算坐标代码的方式来布局UI界面,这种方式的缺点在于当苹果发布新尺寸设备时需要重写代码来适配。

Autolayout的思想和安卓的相对布局比较像,通过设置控件与其父控件、相邻控件之间的关系来确定其位置、大小。

即使苹果推出新尺寸设备,Autolayout也能适应新的屏幕,因为它所有的设置都是相对的。

  • AutoResizing

  在Autolayout之前,有AutoResizing可以作屏幕适配,但局限性比较大,有些任务无法完成(两等分屏幕)

  • Autolayout

  1. Autolayout的2个核心概念:参照和约束

    • 参照:参照的对象
    • 约束:对控件位置大小的约束

  2. Autolayout的警告和错误

    • 警告(黄色图标):控件的frame不匹配所添加的约束, 比如约束控件的宽度为100, 而控件现在的宽度是110
    • 错误(红色图标):缺乏必要的约束,比如只约束了宽度和高度, 没有约束具体的位置;两个约束冲突, 比如1个约束控件的宽度为100, 1个约束控件的宽度为110

  3.代码实现Autolayout

    之前在学习使用Autolayout时都是在storyboard中拖拖拽拽,很多原理都没有理解,导致在页面布局时会有很多地方没有思路去实现。

    拖拽的方式归根到底还是会转化成代码,通过代码实现Autolayout能知其所以然。

    • 代码实现Autolayout的步骤

      1. 利用NSLayoutConstraint类创建具体的约束对象
      2. 添加约束对象到相应的view上

          - (void)addConstraint:(NSLayoutConstraint *)constraint;

          - (void)addConstraints:(NSArray *)constraints;

    • 代码实现Autolayout的注意点
      1. 要先禁止autoresizing功能,设置view的下面属性为NO(view.translatesAutoresizingMaskIntoConstraints = NO)
      2. 添加约束之前,一定要保证相关控件都已经在各自的父控件上
      3. 不用再给view设置frame
    • NSLayoutConstraint

      一个NSLayoutConstraint对象就代表一个约束

      创建约束对象的常用方法:

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
view1 :要约束的控件
attr1 :约束的类型(做怎样的约束)
relation :与参照控件之间的关系
view2 :参照的控件
attr2 :约束的类型(做怎样的约束)
multiplier :乘数
c :常量

      自动布局有个核心公式

      obj1.property1 =(obj2.property2 * multiplier)+ constant value

    • 添加约束的规则

      在创建约束之后,需要将其添加到作用的view上

      在添加时要注意目标view需要遵循以下规则:

      1)对于两个同层级view之间的约束关系,添加到它们的父view上

  

      

      2)对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
      

      3)对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上

      通过代码方式来添加Autolayout会比较繁琐,每个约束都需要实例化一个NSLayoutConstraint对象,然后添加到对应的view上,一个简单的需求需要写很多代码才能实现,无论从生理上还是心理上都是拒绝的。

  下面一篇博客 我将会对VFL(Visual Format Language)进行介绍,它是苹果为简化Autolayout的编码而推出的抽象语言

如果觉得写的好不错,打赏点买个饮料

网上写的比较好的关于Autolayout的帖子:

http://ued.ctrip.com/blog/?p=3736#

http://lvwenhan.com/ios/441.html

http://mathewsanders.com/designing-adaptive-layouts-for-iphone-6-plus/

iOS开发-Autolayout小结的更多相关文章

  1. AIR for IOS开发问题小结

    昨天终于成功地向APP STORE提交了应用,个人感觉用AIR做IOS开发就是个坑啊.出了问题之后,问苹果的技术支持,人家说“对于非XCODE环境下开发及发布所造成的问题我们在资料库中无法找到相应的解 ...

  2. IOS开发GCD小结

    0. Brief Introduction GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后 ...

  3. iOS开发——Autolayout下动态调整单元格高度

    情景描述: 有时候我们希望更新某一个单元格的数据,通常的做法是使用reloadData方法更新整个单元格.但是对一些情况是不适用的或者说实现起来比较麻烦.比如说这种简单的"点开"一 ...

  4. iOS开发——NSString小结

    1.创建常量字符串. NSString *astring = @"This is a String!";   2.创建空字符串,给予赋值. NSString *astring = ...

  5. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  6. iOS开发网络篇—网络请求(HTTP协议)小结

    iOS开发网络篇—网络请求(HTTP协议)小结 iOS开发网络篇—网络请求(HTTP协议)小结 1. 聊一下HTTP协议(协议的完整的通信过程) 2.通信过程 1> 请求 * 客户端 --> ...

  7. iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

    iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...

  8. IOS开发,知识点小结,ios开发中经常使用的宏定义总结

    IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...

  9. iOS开发之山寨版新浪微博小结

    在之前的博客IOS开发之新浪围脖中获取微博的内容是使用我自己的access_token来请求的数据,那么如何让其他用户也能登陆并获取自己的微博内容呢?接下来就是OAuth和SSO出场的时候啦.OAut ...

随机推荐

  1. php 常用的标签比较

    eq或者 equal 等于 neq 或者notequal 不等于 gt 大于 egt 大于等于 lt 小于 elt 小于等于 heq 恒等于 nheq 不恒等于

  2. 客户端Cookie读取操作

    function SetCookie(name,value) { //此 cookie 将被保存 30 天(可活动配置) var Days = 30; var exp = new Date(); ex ...

  3. c数组

    一维数组 有三种赋值方式 1.原始的赋值 2. 初始化赋值 3.动态赋值 数组的花式玩法 void main() { ] = {, , , , , , , , , }; test(a); putcha ...

  4. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  5. Cisco交换机端口聚合(EtherChannel)

    端口聚合,英文简称EtherChannel(以太通道)是由Cisco研发的,应用于交换机之间的多链路捆绑技术.它的基本原理是: 将两个设备间多条物理链路捆绑在一起组成一条逻辑链路,从而达到带宽倍增的目 ...

  6. MySQL删除数据库时的错误

    From: http://blog.csdn.net/mydeman/article/details/6843398 由于在9月30号粗暴地打断了一个导入进程,今天发现MySQL竟然不能启动了,只好卸 ...

  7. Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

    上一篇分享了 Nginx + Tomcat 反向代理 负载均衡 集群 部署指南,感觉还是相当实用型的,但是一般集群部署是基于大访问量的,可能有的企业用不到,类似一些企业官网,访问量并不是很大,基于这个 ...

  8. 使用redis镜像

    运行容器 runoob@runoob:~/redis$ docker run -p : -v $PWD/data:/data -d redis:3.2 redis-server --appendonl ...

  9. SOFA企业应用框架

    前言 从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂.导致复杂性的原因有很多,如果从架构的层面看, ...

  10. memcached注意事项与应用范围、应用条件、限制

    一.服务器内存为4GB,却仅分配量3GB,因为内存分配量超过这个值,可能导致内存交换(swap). memcached启动时 指定的内存分配量是memcached用于保存数据的内存大小,没有包括&qu ...