1. iOS两种自适应布局方式:(修正说明:)

-AutoLayout(自动布局) + SizeClasses(尺寸类别)

-Autoresizing (自动调整尺寸/弹簧式调整尺寸)

前者 AutoLayout 是从iOS6出现,通过创建视图约束实现自适应,SizeClasses是iOS8 开始出现,用于配合AutoLayout使用,为解决所有(包括iPhone,iPad)iOS设备屏幕尺寸和屏幕旋转时UI的适配。

后者是早期开发使用的适配界面的方式,现在仍然保留。通过弹簧式调整控件尺寸,使其适应屏幕的尺寸变化。

苹果官方建议使用AutoLayout。

Autoresizing 缺点:

> 其描述界面变化规则不够灵活,很多变化规则根本无法精确描述。autoresizingMask缩放比例是UIKit内部计算的,开发者无法指定缩放比例的精确值。

  • > 变化规则只能基于父视图与子视图之间,无法建立同级视图或者跨级视图之间的关系。

AutoLayout 的核心原理:

> view具有自我计算尺寸,布局的能力。通过它自身的内容,能够得到尺寸。

> view的布局位置,确定于它与superview及其他view的关系。

> 与传统的autoresizingmask自适应相比,AutoLayout更精确,能绝对的确定view的布局。

> view不一定需要一个初始的rect。AutoLayout中,view如果有足够的constraint,便可以确定自己的尺寸和位置,并且知道自己和其他view的关系。即,想确定view的布局,就给它(们)添加constraint。

2. AutoLayout 自动布局 有三种方式:

> 在Xcode 可视化界面 Interface Builder 中右下角添加并设置约束

> 纯代码添加约束

> 纯代码通过可视化格式语言VFL(Visual Format Language) 添加约束

2.1 可视化设置约束

Interface Builder中,右下角,依次是Alignment(布局),Pin(固定),Resolve(解决约束错误)

以下列出三项中常用的项

Alignment: Horizontally in Container  在容器中水平中心,值为0,设置其他值时,表示水平方向偏移中心位置量

Vertially in Container 在容器中竖直中心,值为0,设置其他值时,表示水平方向偏移中心位置量

Pin:

上方四个值,从左侧顺时针依次是:

Leading Space to Superview // 相对于父视图的左间距 leading:首部

Top Space to Superview       // 相对于父视图的上间距

Trailing Space to Superview  // 相对于父视图的右间距 trailing:尾部

Bottom Space to Superview  // 相对于父视图的底间距

Width : 固定自身宽度

Height : 固定自身高度

若要使多个视图相同的宽度,高度,则先同时选中多个视图,然后在Pin中选择:

  EqualWidths: 多个视图相同宽度;EqualHeights: 多个视图相同高度

若要使两个视图水平方向或垂直方向上相互之间的距离固定,先选中其中一个视图,同时按住键盘上control键,拉线到另一个视图,在弹出框中:

选中 Horizontal Spacing (水平方向间距) 或 Vertical Spacing(竖直方向间距),然后在被选中视图的Size Inspector(右侧倒数第二个选项卡) 中Constraints 栏目下,如图所示: 点击“Edit”,

弹出     在 constant中输入固定间距值

Resolve: 主要使用到 Clear Constraints 清除视图的约束

2.2 纯代码设置约束

NSLayoutConstraint 布局约束类

> 纯代码方式添加视图,不指定frame(若可视化下添加其位置,大小对约束有影响,会产生冲突)

> 设置禁止自动尺寸转换成约束,否则会产生约束冲突

被约束的视图.translatesAutoresizingMaskIntoConstraints = NO

在可视化下Interface Builder 上默认设置就是关闭的

> 创建约束

[NSLayoutConstraint constraintWithItem:lb attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:100]

// 参数一:被约束的视图:view1

// 参数二:指定在被约束的视图哪个属性上约束,位置或大小

// 参数三:被约束的视图与参照视图指定属性之间的关系

// 参数四:参照视图:view2

// 参数五:参照视图的属性

// 参数六: multiplier:被约束视图指定属性是参照视图指定属性的多少倍

// 参数七:被约束视图的指定属性需要加的浮点数 value

计算公式:view1.attr [=,>=,<=] view2.attr * multiplier + value;

> 添加约束

注意:约束是添加到参照视图上。

[view2 addConstraint: ]

[扩展] 第三方库实现约束 Masonry

官网: https://github.com/SnapKit/Masonry

2.3 VFL设置约束

通过 NSLayoutConstraint 类方法:

+ (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(nullable NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *, id> *)views;

示例:

NSArray *constraints=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[button]-[button1(==height)]"

                         options:0

                         metrics:@{@"height":@30}

                         views:NSDictionaryOfVariableBindings(button1,button2)];

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

  1. iOS AutoLayout自动布局&Masonry介绍与使用实践

    Masonry介绍与使用实践:快速上手Autolayout http://www.cnblogs.com/xiaofeixiang/p/5127825.html http://www.cocoachi ...

  2. iOS:Autolayout自动布局实例

    Autolayout自动布局实例即可以用故事板布局,也可以用纯代码创建,各有各的优点:用故事板布局,比较方便,而且直观,可以很直白的看到视图布局后的变化:采用代码布局,虽然代码比较多,有些麻烦,但是可 ...

  3. AutoLayout自动布局

      原文转自http://www.cnblogs.com/xjf125/p/4895978.html 目录: 一.什么是AutoLayout? 二.创建autoLayout的方法 三.VFL语言   ...

  4. 轻量级应用开发之(06)Autolayout自动布局1

    一 什么是Autolayout Autolayout是一种“自动布局”技术,专门用来布局UI界面的. 自IOS7 (Xcode 5)开始,Autolayout的开发效率得到很大的提高. 苹果官方也推荐 ...

  5. AutoLayout自动布局之VFL语言代码实现(一个神奇的语言)

    一.什么是VFL语言?为什么要VFL语言? VFL全称是Visual Format Language,翻译过来是“可视化格式语言” VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言 ...

  6. AutoLayout自动布局,NSLayoutConstraint 视图约束使用

    一.方法 NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:<#(id)#> attribut ...

  7. 轻量级应用开发之(06)Autolayout自动布局2

    一 Masonry 下载地址:https://github.com/SnapKit/Masonry

  8. 几种AutoLayout自动布局所经常使用的布局约束类型

    width表示约束ui控件的固定宽度 height表示约束ui控件的固定高度 Leading Space to Superview 与父视图的左边界线保持固定距离 Trailing Space to ...

  9. [OC] autoLayout 博客文档

    tip :记录几个博客文档 iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束.修改约束.布局动画 iOS AutoLayout自动布局中级开发教程(5)-修改约束的值,延迟加载 ...

随机推荐

  1. Create Volume 操作(Part II) - 每天5分钟玩转 OpenStack(51)

    上一节我们讨论了 Cinder 创建 Volume 的第一部分,cinder-api 的操作,本节继续第二部分,cinder-scheduler 调度工作. cinder-scheduler 执行调度 ...

  2. Javascript之一切皆为对象1

    在javascript的世界里,有这么一句话,一切皆为对象. 但是这个对象,应该怎么理解呢? OMG,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在JavaScrip ...

  3. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  4. 学习Linux下s3c2440的USB鼠标驱动笔记

    1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...

  5. POST方式提交表单时,后台接受实体如果继承了父类,将无法映射表单对应数据

    引言 刚才在做一个post提交表单时,我在表单里放了几个隐藏域用来存放数据,表单name属性和后台实体属性签名保持一致.只是后台Action参数包含继承关系,所以无法获取到表单对应的值.刚开始一直纳闷 ...

  6. Solr学习总结(五)SolrNet的基本用法及CURD

    上一篇已经讲到了Solr 查询的相关的参数.这里在讲讲C#是如何通过客户端请求和接受solr服务器的数据, 这里推荐使用SolrNet,主要是:SolrNet使用非常方便,而且用户众多,一直都在更新, ...

  7. 浅谈移动端之touch事件--手指的滑动事件

    今天台风‘海马’袭击深圳,全市停工.现分享一篇关于touch的文章,望指教! 原理: 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touch ...

  8. Azure ARM (14) 设置ARM VM的Availability Set

    <Windows Azure Platform 系列文章目录> 参考资料:https://gallery.technet.microsoft.com/Set-Azure-Resource- ...

  9. 用户反馈:对 Rafy 开发框架的一些个人建议

      这篇文章是去年 Rafy 框架发布后,许胜平先生为我提出的一些建议.他从用户群体分析.社区.商业模式.技术支持等方面对框架发展提出了建议,我觉得写得非常不错.此文不仅适用于 Rafy 框架,所以不 ...

  10. jquer 事件,选择器,dom操作

    一.jQuery简介 jQuery 是一个 JavaScript 库.(其实就是js,就是封装了,语法上有些不一样) jQuery 极大地简化了 JavaScript 编程. jQuery 库位于一个 ...