轮子阅读之SDAutoLayout

几乎在我们所有的iOS App 项目中我们都为了开发方便,为了Deadline都会在我们的项目中使用一些别人造好的轮子。使用这些轮子一般都很简单,但是我们也要好好学习别人造的这些轮子背后的原因,大神们为什么要这么造?阅读大神们的代码来理解他们的造这些轮子的思想与方法对我们能力的提示也会有很大帮助。这篇文章就简单写一下我阅读SDAutoLayout这个自动布局开源库的源码之后的理解吧。

直接上代码:

UILabel *titleLabel = [[UILabel alloc]init];
titleLabel.text = @"test string";
[self.view addSubview:titleLabel];
titleLabel.sd_layout
             .leftSpaceToView(self.view,20)
             .topSpaceToView(self.view,100)
             .rightSpaceToView(self.view,20)
             .heightIs(20);

上面这段代码就是就是用SDAutoLayout对一个Label进行适配不同屏幕的简单例子。很简单、很暴力,并且是我们用起来很方便的链式调用方式。我们进行断点调试进入到SDAutoLayout的源代码中。

首先执行sd_layout这个方法,这个方法的作用就是创建并初始化一些参数返回SDAutoLayoutModel这个对象的实例,然后就真正的开始进行自动布局的代码。
接下来查看leftSpaceToView()这个方法会看到这个方法是一个懒加载的方法,在懒加载的方法中会执行这个方法marginToViewblockWithKey,这个方法很有意思,其中的key与SDAutoLayoutModel的私有属性left相同。

进入到这个方法就可以看到返回值为一个block,而且在block中会通过KVC的方式设置SDAutoLayoutModel实例的属性(与这个方法的key名字相同)的value为SDAutoLayoutModelItem的实例对象,仔细发现SDAutoLayoutModel实例的私有属性的类型就是SDAutoLayoutModelItem。咋下面中我们也可到作者提供了这些属性的set方法,我们刚学KVC的时候大家都知道,KVC的机制是首先从调用setter方法,找不到setter方法就查找对象是否存在属性等的直到找不到任何相关的就会报错。我们查看这些setter方法就可以看到这写setter方法就是设置当前view的frame的属性。

到这个时候我们就明白了这个第三方库的核心还是设置view的frame来进行适配。但是还有一点不同,在这个方法中还使用了黑魔法(runtime)Method Swizzing,在load方法中替换了layoutSubViews。因为在iOS中设置view的frame就会自动调用layoutSubViews这个方法,下面是会调用layoutSubViews方法的情况:

    1. 直接调用setLayoutSubviews。(这个在上面苹果官方文档里有说明)
    2. addSubview的时候。
    3. 当view的frame发生改变的时候。
    4. 滑动UIScrollView的时候。
    5. 旋转Screen会触发父UIView上的layoutSubviews事件。
    6. 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

在替换的sd_layoutSubviews中执行了sd_layoutSubviewsHandle这个方法,这个方法就是针对不同的view及情况进行宽度、高度等属性进行计算,并且会缓存tableViewCell的高度等。
接下来的topSpaceToView、rightSpaceToView、heightIs等方法跟leftSpaceToView方法类似,大同小异,我就不做一一解释了。

总结一下这个开源库的原理就是通过KVC、链式调用、Runtime的Method Swizzing等技术创造的轮子。这个库还提供了一些其他功能,我们平时开发使用起来还是很简单方便的,能很大程度上提高我们的开发效率。工作之余可以多学学作者怎么使用这些技术创造轮子以及为什么这样写也是一件很有趣的事情。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 原文 序言 目 前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到...
    星空下的菜地阅读 3,043评论 3 42
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    麦兜兜买兜兜阅读 669评论 1 4
  • -今日宜倾听大学期间的爱情- 尤记得有人说过,如愿以偿,不如阴差阳错。有时候,失去是一种拥有,失去一个人并不可怕,...
    饮尽风雪丶阅读 355评论 5 7
  • 10月14日下午,市委常委、常务副市长顾刚深入新海港检查指导防台工作,现场强调市交通港航局及港口企业要坚决落实...
    清风花开阅读 1,118评论 0 0
  • #约定 很久以前看过一个故事,一直记忆深刻。故事里的小姑娘,在一个暑假的下午和表姐在家正玩的开心,她的姑姑说:“如...
    lenna酱阅读 554评论 7 3