iOS 自动布局详细介绍

1. 自动布局的理解

iOS自动布局很有用,可以在不同size的屏幕上运行,原先看的头痛,还是习惯用最蠢的[UIScreen mainScreen].bounds.size.width等来布局,后来实在不行了,开始好好地看自动布局,发现理解后真的很好用,现在就来分享分享我的心得吧。

首先要明白一个控件在屏幕上的位置怎么样才能真正地确定。最简单的情况是:

1. 例如一个矩形,只要知道它左上角点的坐标,宽,高,那么位置就固定了。

2. 例如一个圆,只要知道它的圆心坐标,半径,那么位置就固定了。

自动布局就是这个意思,它可以理解为活的布局,因为确定一个控件的位置有很多方法,死死地确定位置,那么屏幕size变了,可能位置就不是我们想要的。

所以做自动布局的时候,需要思考的就是屏幕变的情况下,我设定的约束条件还能使它在我想要的位置,那么这些约束条件就是好的。

举个最简单的例子。让一个矩形在屏幕正中。

设定它的左上角坐标,宽,高。那么屏幕变了位置肯定变了。

设定它的中心为屏幕的中心,宽,高,那么屏幕size变了,它肯定还在中心,这就是好的约束。

所以我的理解就是,自动布局的核心就在于,设定好的约束,让屏幕的size变化时,它所在的位置仍然是我们想要的

2. 自动布局的实现

自动布局的实现只有两种。

1. storyboard

2. 纯代码控制

在storyboard上设定约束条件很容易,按住Ctrl拖动就可以了。如果你设定的约束条件不足或者冲突,那么会有红色的提示;如果你设定的约束条件和你控件所在的位置有误差,那么会有黄色的提示,按下让系统更改就行了。

最容易的方法就是,拖控件的时候让它和屏幕上显示的蓝线对齐,最后reset to suggested constraints就行了。

不过有些情况还是需要自己来设定。

3. 纯代码设定约束

很多人是纯代码流,如果用纯代码来设定约束,也有很多方法,比较常见的是3种。

1.  constraints with visualFormat

例如

//给文本框添加约束
    self.sendTextView.translatesAutoresizingMaskIntoConstraints = NO;
    NSString *sendStringH = [NSString stringWithFormat:@"H:|-(%d)-[_sendTextView(%f)]",padding,textViewWidth];
    NSString *sendStringV = [NSString stringWithFormat:@"V:|-(%d)-[_sendTextView]-(%d)-|",padding,padding];
    NSArray *sendTextViewConstraintH = [NSLayoutConstraint constraintsWithVisualFormat:sendStringH options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];
    [self addConstraints:sendTextViewConstraintH];

    NSArray *sendTextViewConstraintV = [NSLayoutConstraint constraintsWithVisualFormat:sendStringV options:0 metrics:0 views:NSDictionaryOfVariableBindings(_sendTextView)];
    [self addConstraints:sendTextViewConstraintV];

有两个需要注意的地方:

因为大部分情况是相对于父视图和兄弟视图的布局,所以一定要先让父视图addSubView,然后在设定约束。

[]里要用_View,不要用self.view,这个stackOverflow上有解释。

它的用法主要是constraintsWithVisualFormat的参数的指定参数为NSString型,指定Contsraint的属性,是垂直方向的限定还是水平方向的限定,参数定义一般如下:

V:|-(>=x)-[_view(x)]-((>=x))-| :表示垂直方向上相对于SuperView左右间距大于、等于、小于某个距离

若是要定义水平方向,则将V:改成H:就可以了。
options:字典类型的值;这里的值一般在系统定义的一个enum里面选取
metrics:nil;一般为nil ,参数类型为NSDictionary,从外部传入 //衡量标准
views:就是上面所加入到NSDictionary中的绑定的View

在这里要注意的是 AddConstraints  和 AddConstraint 之间的区别,一个添加的参数是NSArray,一个是NSLayoutConstraint

使用的一些规则

|: 表示父视图

-:表示距离

V:  :表示垂直

H:  :表示水平

>= :表示视图间距、宽度和高度必须大于或等于某个值

<= :表示视图间距、宽度和高度必须小宇或等于某个值

== :表示视图间距、宽度或者高度必须等于某个值

@  :>=、<=、==  限制   最大为  1000

一些使用例子:

1.|-[view]-|:  视图处在父视图的左右边缘内

2.|-[view]  :   视图处在父视图的左边缘

3.|[view]   :   视图和父视图左边对齐

4.-[view]-  :  设置视图的宽度高度

5.|-30.0-[view]-30.0-|:  表示离父视图 左右间距  30

6.[view(200.0)] : 表示视图宽度为 200.0

7.|-[view(view1)]-[view1]-| :表示视图宽度一样,并且在父视图左右边缘内

8. V:|-[view(50.0)] : 视图高度为  50

9: V:|-(==padding)-[imageView]->=0-[button]-(==padding)-| : 表示离父视图的距离

为Padding,这两个视图间距必须大于或等于0并且距离底部父视图为 padding。

10:  [wideView(>[email protected])]  :视图的宽度为至少为60 不能超过  700 ,最大为1000

2. 通过函数显示地添加一个个约束

@interface NSLayoutConstraint : NSObject
...
@property (readonly, assign) id firstItem;
@property (readonly) NSLayoutAttribute firstAttribute;
@property (readonly) NSLayoutRelation relation;
@property (readonly, assign) id secondItem;
@property (readonly) NSLayoutAttribute secondAttribute;
@property (readonly) CGFloat multiplier;
@property CGFloat constant;
...
+(instancetype)constraintWithItem:(id)firstItem attribute:(NSLayoutAttribute)firstAttribute
 relatedBy:(NSLayoutRelation)relation
 toItem:(id)secondItem attribute:(NSLayoutAttribute)secondAttribute
 multiplier:(CGFloat)multiplier constant:(CGFloat)constant;

主要是通过上面的类函数显示地添加约束。

这个我也是学习的别人的,地址:http://www.2cto.com/kf/201504/391282.html

这个写的很详细,大家看了应该就会了。

3. 第三方开源框架:masonry

这个主要用块来做的,很清晰明了,大家可以去学习源码,很有益。

不过我自己也还没看,只是把别人写的学习了下,大家有兴趣地也可以去学习

地址:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/

时间: 2024-10-07 05:50:55

iOS 自动布局详细介绍的相关文章

ios开发——实用技术篇&amp;Pist转模型详细介绍

Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通过一定的方式返回的plist数据 一:直接加载Plist数据 1 //定义一个数组属性 2 @property (nonatomic, assign) NSArray *apps; 获取Plist文件 1 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以 2 -(NSArray *

学习笔记:APP切图那点事儿–详细介绍android和ios平台

学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址:http://blog.boocss.com/app-android-ios/ 一.android版 在做android版本设计的时候,尺寸有很多种,这时我们要以一种尺寸为基准,那这个基准尺寸是480px*800px,设计图完成之后就开始切图了 需要注意的: A:android主要有3种屏,即:

iOS开发——Swift篇&amp;Swift关键字详细介绍

Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var.” 用于子句的: “ break, case, continue, default, do, else, fallthrough, if, i

Autolayout使用详细介绍

关于Autolayout的初步介绍 说道Autolayout,我也是在iPhone 6 And 6+ 出来之后才开始关注的.我是一个纯代码程序者之前. 那个时候有听说到Xib和Storyboard(现在Xib已经使用的少了,下面直接说storyboard.其实Xib和storyboard只是父子的关系嘛),我开始在网上查找资料,网上给的解释我总结给大家如下: 1.代码是storyboard的升级.就是说,代码比storyboard牛逼啦.这种说法是这样来的:许多IOS开发者,都是在Xib的引导下

常见的七款API聚合平台对比和详细介绍

我们都知道一句话"巧妇难为无米之炊",数据源就是数据产生价值中的那些大米.那大数据时代企业需要哪些数据呢?根据我个人理解我觉得可以大致分为以下几类: 1.(内部)企业自身业务生产经营环节产生的内部数据[包括销售.客服.仓储.财务等] 2.(运营)可以理解为企业发展过程中掌握在第三方手中的数据,如企业的广告供应商以及一些传播与媒体数据[新媒体.H5.app等] 3.(外部)包括传统调研数据和机器数据[搜索.电商.社交等].而对于外部数据的获取上,企业往往会觉得有难度,这时候就可以借助AP

iOS 自动布局

自动布局框架 Masonry PureLayout FLKAutoLayout KeepLayout UIView+Autolayout 相关教程: iOS 开发实践之 Auto Layout Masonry介绍与使用实践(快速上手Autolayout) IOS自动布局之Autoresizing iOS中的相对布局:AutoLayout

HTML5统计图表amCharts JavaScript 统计图控件详细介绍

amCharts控件提供您最需要的JavaScript/HTML5图表.一套包括串行(列,栏,线,区,步线,平滑线,烛台,OHLC图),馅饼 /甜甜圈,雷达/极性和XY /分散/气泡图.amCharts的图表提供了无与伦比的功能和性能,在一个高级的,符合标准的包里. 支持所有高级浏览器 amCharts的JavaScript图表支持所有高级浏览器(包括但不限于)现代火狐,Chrome,Safari,Opera和Internet Explorer的版本.它的iPad,iPhone,iPod Tou

iOS自动布局——Masonry详解

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂新鲜事儿发表于云+社区专栏 作者:oceanlong | 腾讯 移动客户端开发工程师 前言 UI布局是整个前端体系里不可或缺的一环.代码的布局是设计语言与用户视觉感受沟通的桥梁,不论它看起来多么简单或是琐碎,但不得不承认,绝大部分软件开发的问题,都是界面问题.那么,如何高效的完成UI开发,也是软件行业一直在克服的问题. 所以,软件界面开发的核心点即是:如何减少UI设计稿的建模难度和减少建模转化到代码的实现难度 最初iOS提供了

react-native热更新之CodePush详细介绍及使用方法

react-native热更新之CodePush详细介绍及使用方法 2018年03月04日 17:03:21 clf_programing 阅读数:7979 标签: react native热更新code pushJSRN更多 个人分类: react native React Native应用部署/热更新-CodePush最新集成总结 React Native应用部署/热更新-CodePush最新集成总结(新) 本文出自<React Native学习笔记>系列文章.了解更多,可以关注我的Git