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: metrics: views:NSDictionaryOfVariableBindings(_sendTextView)];
[self addConstraints:sendTextViewConstraintH]; NSArray *sendTextViewConstraintV = [NSLayoutConstraint constraintsWithVisualFormat:sendStringV options: metrics: 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(>=60@700)] :视图的宽度为至少为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/
iOS 自动布局详细介绍的更多相关文章
- iOS Block详细介绍(block实现)
Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; un ...
- iOS UIButton详细介绍
昨天,做了项目中的一点,觉得细节还是很重要的.像一个普通的UIButton,给它调试字体格式,大小什么的,确实是蛮耗时间的. 今天打算详细的归纳归纳.. typedef NS_ENUM(NSInteg ...
- 学习笔记:APP切图那点事儿–详细介绍android和ios平台
学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html 版权归原作者所有 作者:亚茹有李 原文地址 ...
- iOS开发——实用OC篇&多种定时器详细介绍
多种定时器详细介绍 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有 ...
- ios开发——实用技术篇&Pist转模型详细介绍
Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...
- iOS开发——Swift篇&Swift关键字详细介绍
Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension ...
- Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
转自:http://www.himigame.com/iphone-cocos2dx/743.html Cocos2dx系列博文的上一篇详细介绍了如何在Xcode中利用jni调用Android的Jav ...
- iOS 自动布局总结
参考自以下文章: http://blog.csdn.net/ysy441088327/article/details/12558097 http://blog.csdn.net/zhouleizhao ...
- react-native热更新之CodePush详细介绍及使用方法
react-native热更新之CodePush详细介绍及使用方法 2018年03月04日 17:03:21 clf_programing 阅读数:7979 标签: react native热更新co ...
随机推荐
- SPI总线通信电路设计
数据带宽=(总线频率×数据位宽)÷8 B表示带宽,F表示存储器时钟频率,D表示存储器数据总线位数,则带宽为: B(峰值带宽)=F(时钟频率MHz)×D(总线位数bit)/8 例如,PC-100的SDR ...
- NHibernate 使用CreateSQLQuery进行查询
涉及的表:Cake{Id ,CakeName } CakeSize{ CakeId,-为外键,对应Cake表的字段Id Size } (其中ISession session = NHibernateH ...
- 对 JimmyZhang 老师的文章《项目代码风格要求》的一些个人观点
Jimmy Zhang 老师是博客园中我最佩服的人之一,今天看了他的文章<项目代码风格要求>觉得大部分地方我都很认同,工作中也是强迫自己也要按照规范来编程.下面是我的一些个人观点,想贴出来 ...
- Logstash日志搜集
软件准备: logstash-2.1.0.zip elasticsearch-2.1.0.zip kibana-4.3.0-windows.zip Redis-x64-2.8.2104.msi 下载地 ...
- webpack+vue-loader 在单独.vue组件中使用sass-loader编译sass报错问题not a valid Win32 applictation
如果webpack配置没有问题,在vue文件中编译sass/scss报上面的错误,大概是由于node-sass安装失败,重新卸载安装, 在国内安装node-sass失败的话,可以使用淘宝镜 ...
- 如何查看distirbution agent的执行进度
在transactional replication troubleshooting的过程中,经常会遇到下面的场景: 客户在发布端执行了一个几百万行的更新,结果导致性能下降. 客户很想知道目前dist ...
- AssetBundle系列——共享资源打包/依赖资源打包
有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数: BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.P ...
- ASP.NET 让无码编程不在是梦 -.NET通用平台、通用权限、易扩展、多语言、多平台架构框架
先拿出我半前年前平台的设计初稿,经过半年的努力我已经完成了该设计稿的所有功能.并且理念已经远远超出该设计稿. 下面是一些博友对我贴子的评价: 1.楼主,想法很美好,现实很骨感,我们公司就有一套你说的这 ...
- HT图形组件设计之道(四)
在<HT图形组件设计之道(二)>我们展示了HT在2D图形矢量的数据绑定功能,这种机制不仅可用于2D图形,HT的通用组件甚至3D引擎都具备这种数据绑定机制,此篇我们将构建一个3D飞机模型,展 ...
- 更加优雅地配置Spring Securiy(使用Java配置和注解)
Spring Security 借助一系列Servlet Filter 来提供安全性功能,但是借助Spring的小技巧,我们只需要配置一个Filer就可以了,DelegatingFilterProxy ...