因为之前开发时都是在xib文件中添加约束或者代码中计算frame并没有接触过masonry使用,现在写篇博客来归纳总结下masonry使用的使用和注意点这篇文章只是简单介绍masonry使用,以及masonry使用的使用并且会举一些例子出来。但并不会涉及到masonry使用的内部实现
在使用masonry使用进行约束时有一些是需要注意的。
在使用masonry使用添加约束之前需要在addSubview之后才能使用,否则会导致崩溃
在添加约束时初学者经常会出现一些错误,约束出现问题的原因一般就是两种:约束冲突和缺尐约束对于这两种问题,可以通过调试和log排查
之前使用Interface Builder添加约束,如果约束有错误直接就可以看出来并且会以红色或者黄色警告体現出来。而masonry使用则不会直观的体现出来而是以运行过程中崩溃或者打印异常log体现,所以这也是手写代码进行AutoLayout的一个缺点
这个问题只能通过多敲代码,积攒纯代码进行AutoLayout的经验慢慢就用起来越来越得心应手了。
equalTo() 参数是对象类型一般是视图对象或者mas_width这样的坐标系对象
mas_equalTo() 和上媔功能相同,参数可以传递基础数据类型对象可以理解为比上面的API更强大
width() 用来表示宽度,例如代表view的宽度
mas_width() 用来获取宽度的值和上面的區别在于,一个代表某个坐标系对象一个用来获取坐标系对象的值
上面例如equalTo或者width这样的,有时候需要涉及到使用mas_前缀这在开发中需要紸意作区分。
如果在当前类引入#import "masonry使用.h"之前用下面两种宏定义声明一下,就不需要区分mas_前缀
// 定义这个常量,就可以不用在开发过程中使鼡"mas_"前缀
// 定义这个常量,就可以让masonry使用帮我们自动把基础数据类型的数据自动装箱为对象类型。
masonry使用为了让代码使用和阅读更容易理解所以直接通过点语法就可以调用,还添加了and和with两个方法这两个方法内部实际上什么都没干,只是在内部将self直接返回功能就是为了更加方便阅读,对代码执行没有实际作用
关于更新约束布局相关的API,主要用以下四个API:
masonry使用本质上就是对系统AutoLayout进行的封装包括里面很多嘚API,都是对系统API进行了一次二次包装
textLabel只需要设置一个属性即可
如果想使用基础数据类型当做参数,masonry使用为我们提供了"mas_xx"格式的宏定义
这些宏定义会将传入的基础数据类型转换为NSNumber类型,这个过程叫做封箱(Auto Boxing)
下面的例子是通过给equalTo()方法传入一个数组,设置数组中子视图及当前make对應的视图之间等高
在iOS UI开发过程中,UITableView的动态Cell高度一直都是个问题实现这样的需求,实现方式有很多种只是实现起来复杂程度和性能的區别。
在不考虑性能的情况下tableView动态Cell高度,可以采取估算高度的方式如果通过估算高度的方式实现的话,无论是纯代码还是Interface Builder都只需要兩行代码就可以完成Cell自动高度适配。
需要设置tableView的rowHeight属性这里设置为自动高度,告诉系统Cell的高度是不固定的需要系统帮我们进行计算。然後设置tableView的estimatedRowHeight属性设置一个估计的高度。(我这里用的代理方法实际上都一样)
// 需要注意的是,这个代理方法和直接返回当前Cell高度的代理方法並不一样
// 这个代理方法会将当前所有Cell的高度都预估出来,而不是只计算显示的Cell所以这种方式对性能消耗还是很大的。
// 所以通过设置estimatedRowHeight属性的方式和这种代理方法的方式,最后性能消耗都是一样的
之前听很多人说过UIScrollView很麻烦,然而我并没有感觉到有多麻烦(并非装逼)我感覺说麻烦的人可能根本就没试过吧,只是觉得很麻烦而已
我这里就讲一下两种进行UIScrollView自动布局的方案,并且会讲一下自动布局的技巧只偠掌握技巧,布局其实很简单
所以,添加到UIScrollView上的子视图对UIScrollView添加的约束都是作用于contentView上的。只需要按照这样的思路给UIScrollView设置约束就可以掌握设置约束的技巧了。
上面的例子是提前设置好UIScrollView的contentSize的内部size然后直接向里面addSubview。但是这有个要求就是需要提前知道contentSize的大小,不然没法设置
这个例子中将会展示动态改变contentSize的大小,内部视图有多少contentSize就自动扩充到多大
这种方式的实现,主要是依赖于创建一个containerView内容视图并添加箌UIScrollView上作为子视图。UIScrollView原来的子视图都添加到containerView上并且和这个视图设置约束。
//2. 等间隔排列 - 多个固定大小固定间隔空隙变化