源码阅读:Masonry(三)—— MASViewAttribute
该文章阅读的 Masonry 的版本为 1.1.0。
这个类我们可以叫它“约束视图及其属性类”,它封装了设置约束的视图和其设置约束的属性,也就是 view1 和 attr1,或是 view2 和 attr2。
1.公共属性
@property (nonatomic, weak, readonly) MAS_VIEW *view;
复制代码
这个属性保存的是约束所在的视图,可以为 nil。
@property (nonatomic, weak, readonly) id item;
复制代码
这个属性保存的是约束的 item,也就是 NSLayoutConstraint 中的 view1 和 view2, 大多数情况,item 就是上面的属性 view。
当如下代码设置约束时:
make.top.equalTo(self.mas_topLayoutGuide);
复制代码
或者:
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop);
复制代码
这类相关的约束时,item 和 view 才不相同。view 还是保存约束所在的视图,但 item 就是保存 UIViewController 的 topLayoutGuide 属性或者 UIView 的 safeAreaLayoutGuide 属性了。
@property (nonatomic, assign, readonly) NSLayoutAttribute layoutAttribute;
复制代码
这个属性中保存的就是约束的属性,也就是 NSLayoutConstraint 中的 attr1 和 attr2。
2.公共方法
- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute;
复制代码
以指定约束的视图和约束的属性初始化的方法。
- (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute;
复制代码
以指定约束的视图,约束的 item 和约束的属性初始化的方法。
- (BOOL)isSizeAttribute;
复制代码
这个方法用于获取设置的约束的属性是否是 size 类型的,也就是直接设置宽和高类型的。
3.方法实现
3.1 公共方法的实现
- (id)initWithView:(MAS_VIEW *)view layoutAttribute:(NSLayoutAttribute)layoutAttribute {
// 从这个方法的实现中,我们就可以看到,view 和 item 在大多数情况下是同一个对象
self = [self initWithView:view item:view layoutAttribute:layoutAttribute];
return self;
}
复制代码
- (id)initWithView:(MAS_VIEW *)view item:(id)item layoutAttribute:(NSLayoutAttribute)layoutAttribute {
// 在这个方法中只是保存了一下传递的参数
self = [super init];
if (!self) return nil;
_view = view;
_item = item;
_layoutAttribute = layoutAttribute;
return self;
}
复制代码
- (BOOL)isSizeAttribute {
// 只要是直接设置了约束的宽或高就返回 YES,否则就是 NO
return self.layoutAttribute == NSLayoutAttributeWidth
|| self.layoutAttribute == NSLayoutAttributeHeight;
}
复制代码
3.2 父类方法的重写
- (BOOL)isEqual:(MASViewAttribute *)viewAttribute {
// 先判断是否是当前类或其子类
if ([viewAttribute isKindOfClass:self.class]) {
// 必须满足设置约束的视图和设置约束的属性都相等,才算两个对象相等。
return self.view == viewAttribute.view
&& self.layoutAttribute == viewAttribute.layoutAttribute;
}
// 如果不是当前类或其子类,就直接调用父类方法判断。
return [super isEqual:viewAttribute];
}
复制代码
- (NSUInteger)hash {
// 这个地方就用到了我们在上一篇文章 MASUtilities 中看到的宏
// 首先将设置约束的视图的 hash 从中间反转,然后再异或上设置约束的属性
return MAS_NSUINTROTATE([self.view hash], MAS_NSUINT_BIT / 2) ^ self.layoutAttribute;
}
复制代码
为什么要重新父类的这两个方法?
- 这就涉及到当对象被添加到 NSSet 对象中,或者对象作为 key 添加到 NSDictionary 对象中的底层实现了。
- 为了提高效率, NSSet 和 NSDictionary 底层是使用 hash 表来实现的,所以当向其中添加对象时,它们会利用要添加的对象的 hash 值来查找判断该对象是否已经存在。
- 在实现中,这个过程被分为两步:
- 先调用对象 hash 方法获取对象的 hash 值获对象在 hash 表的位置
- 如果找到了位置,也就是和目标 hash 值相等,就调用
isEqual:判断两个对象内容是否相等。
4.总结
这个类东西不多,主要工作就是将 view 和 attr 封装成一个对象。
源码阅读:Masonry(三)—— MASViewAttribute的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】SDWebImage源码阅读(三)
[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...
- 【详解】ThreadPoolExecutor源码阅读(三)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...
- Redis源码阅读(三)集群-连接初始化
Redis源码阅读(三)集群-连接建立 对于并发请求很高的生产环境,单个Redis满足不了性能要求,通常都会配置Redis集群来提高服务性能.3.0之后的Redis支持了集群模式. Redis官方提供 ...
- SDWebImage源码阅读-第三篇
这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: com ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)浅谈 REST 和 CRUD
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)
最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...
- JDK源码阅读(三):ArraryList源码解析
今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...
- LevelDB的源码阅读(三) Get操作
在Linux上leveldb的安装和使用中我们写了这么一段测试代码,内容以及输出结果如下: #include <iostream> #include <string> #inc ...
随机推荐
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- C++头文件应该干的事情
C++头文件应该干的事情 最近在写自己项目的时候,头文件老是编译错误,后来发现还是对头文件掌握不牢. 头文件应该干什么? 所谓的头文件,其实它的内容跟 .cpp 文件中的内容是一样的,都是 C++ 的 ...
- 7.4 private 成员变量的私有
/* * 学生类(age不能为负数.将age参数私有,创建方法判断age不为负.被private修饰的成员只能在本类中被访问,若想访问可以使用get.set方法) * * 通过对象直接访问成员变量,会 ...
- Struts2-学习笔记系列(7)-PreResultListener
在action处理完成之后,系统转入实际的物理试图之间被回调. Action,拦截器都可以添加该监听器.拦截器添加了该监听器后,该监听器会对该拦截器所有拦截的action其作用 public Stri ...
- 很用心的为你写了 9 道 MySQL 面试题
MySQL 一直是本人很薄弱的部分,后面会多输出 MySQL 的文章贡献给大家,毕竟 MySQL 涉及到数据存储.锁.磁盘寻道.分页等操作系统概念,而且互联网对 MySQL 的注重程度是不言而喻的,后 ...
- x聊之后,又一波新的诈骗套路
前些天刚看到,x聊勒索诈骗套路,骗子的套路可以说是花样百出,这不又一网友深受其害. 事情经过是这样的 某被骗网友由于工资微薄一直想找副业增加收入,关注和加了很多群. 注意群里都是有偏亮头像的”小姐姐” ...
- java课程设计之--Elasticsearch篇
一.团队课程设计博客链接 https://www.cnblogs.com/Rasang/p/12169899.html 二.个人负责模块或任务说明 2.1Elasticsearch简介 Elastic ...
- HttpWebRequest在Post的时候,遇到特殊符号+号(加号)变成空格了
今天在调用一个外部接口的时候遇到一个问题,外部接口说要用FOMR的POST方法提交. OK,没问题,我加了个ASPX页面,里面加了个FORM表单和一些元素,提交,返回值成功.注意看下面这一句:但返回值 ...
- Application.Exit
Application.Exit:通知winform消息循环退出.Environment.Exit:终止当前进程,返回exitcode给操作系统 Application.Exit会在所有前台线程退出后 ...
- 在Python中该如何实现Java的重写与重载
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...