iOS第三方库与框架Struggleios

SDAutoLayout的使用

2016-06-04  本文已影响6224人  翻个墙

~ 写在正文之前:文章转移到翻这个墙中,希望继续关注啦。(2017.11.5)

SDAutoLayout的优缺点

优点

1、语法简单(相比官方的语法,Masonry)
2、纯代码的方式,代码维护容易(相比使用xib,storyboard)
3、UIlabel的内容能够自动根据内容算出宽度
4、UITableviewCell能够自动算出height
5、UIView能够自动算出height
6、创建的时候,只需要alloc->init,不需要关心对应的frame

缺点

1、 leftspacetoview等方式,经常出现UIView布局完以后,不可见,有时候不太准,有时候是self的左边基准,有时候是self的右边为基准,一般来说,self的width都是屏幕宽度,所以子控件的x经常飞出屏幕
2、 花费比预料多很多的时候去调试

SDAutoLayout的爱与痛

说真的,SDAutoLayout如果真的能够做到预计的方便使用,应该是很爽的,但是我个人觉得还是没有到那步。当然也可能是我的能力有限,很多东西都仅仅停留在表面,没办法,不太省心,又开源,又不想轻易放弃,只能啃源码了。

源码分析

1、项目地址
<pre>https://github.com/gsdios/SDAutoLayout</pre>

2、文件总数
说真的,文件也不太多,就4个。这也是我愿意啃源码的一个强有力的原因。

3、代码总数
<pre>
146 ./UITableView+SDAutoTableViewCellHeight.h
374 ./UITableView+SDAutoTableViewCellHeight.m
457 ./UIView+SDAutoLayout.h
1712 ./UIView+SDAutoLayout.m
2689 total
</pre>

4、源码总结
1)利用关键字sd_layout,生成SDAutoLayoutModel并添加到父类的autoLayoutModelsArray数组里去。
2、在sd_layoutSubviews根据上面生成的SDAutoLayoutModel计算frame

3)流程分析
一)先使用sd_layout为父类添加一系列的SDAutoLayoutModel类型的数组autoLayoutModelsArray
二) 在sd_layoutSubviewsHandle根据autoLayoutModelsArray,遍历每个子view,计算每个子view的frame
三) 在sd_resizeWithModel函数里面,生成子view的frame,如果子frame存在sd_bottomViewsArray和sd_rightViewsArray数组,就递归执行上面的步骤。

5、类构成

<pre>下面是一个特别的UIView的特别适用方法</pre>

<pre>下面属于扩展熟悉</pre>
@interface SDAutoLayoutModelItem : NSObject
@interface UIView (SDChangeFrame)
最后结果的处理
@interface SDUIViewCategoryManager : NSObject

5、主要函数分析

3、if (self.autoLayoutModelsArray.count)
真正进行frame计算的判断,主要分为两步,第一步就是缓存的处理,第二步(sd_resizeWithModel)是frame的计算。

4、if (self.tag == kSDModelCellTag && [self isKindOfClass:NSClassFromString(@"UITableViewCellContentView")])
解决UITableviewcell等高计算的,应该是上面的函数没有完全解决这个问题,所以需要额外加入这样的判断。
而且,是UITableViewCellContentView,而不是UITableViewCell,所以在UITableViewCell里面,一般应该将子UIView放入到self.contentview,而不是view里面,不然这个判断会失效,导致cell的高度计算失败

数据计算结果一般都是使用bottom_sd,height_sd等去存储这些数据都是存在于view的。这是新版的处理,旧版的数据没有后缀_sd。新版兼容旧版数据。主要是@interface UIView (SDChangeFrame)完成

上一篇下一篇

猜你喜欢

热点阅读