前言

接触IOS时最让自己懵懂的就是布局,一直不解其意,第一次接触的框架是Masonry,后来才知道了SDAutoLayout

什么是 Masonry

Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API。系统AutoLayout支持的操作,Masonry都支持,相比系统API功能来说,Masonry是有过之而无不及。

Masonry采取了链式编程的方式,代码理解起来非常清晰易懂,而且写完之后代码量看起来非常少。之前用NSLayoutConstraint写很多代码才能实现的布局,用Masonry最少一行代码就可以搞定。

放弃 Masonry 的原因

原因有很多,最主要的原因就是我不爱了?!
Masonry是基于NSLayoutConstraint布局,而一些复杂的UI页面约束布局会影响性能,虽然本人还没遇到很复杂的页面?,不过还是有人做过调研的,
iOS开发针对对Masonry下的FPS优化讨论

SDAutoLayout 驾到

SDAutoLayout是国内牛人写的框架,有很多Demo和视频供初学者入门,也是采用链式编程,但API比Masonry性感多了!
如何设计一个自动布局库:以SDAutoLayout为例----作者原稿
SDAutoLayout是基于Frame的布局,可以让View自适应宽高,cell自适应并缓存高度,这都是优于Masonry的。

SDAutoLayout基本原理

view是没有sd_layout属性的,作者使用动态关联,扩展UIView, 调用getter方法时sd_layout对象生成,此对象作为view对象的布局控制模块, 每次生成一个sd_layout对象,都把它加为super viewautolayoutModelsArray中,sd_layout对象即SDAutoLyaout的实例,SDAutoLayout下设left, top, bottom, right等对象负责具体的布局… 用文字解释不了,看个图:
对 SDAutoLayout 的再次了解

对 SDAutoLayout 的再次了解
当我们调用 view.sd_layout.leftSpaceToView(self.view, 20)时,sd_layout对象的leftSpaceToView是个懒加载的block, 我们这样是调用这个block, 这样在内部SDAutoLayoutframe进行赋值,所以,SDAutoLayout并不像其名字AutoLayout所示通过NSLayoutConstraint来对view进行布局的,它是本质上通过修改视图的frame来处理的。

继续:当调用[someView updateLayout]的时候,我们顺着API找下去:

// UIView的Category中:
-(void)updateLayout {
[self.superview layoutSubviews]; }

也就是说,当对一个view updateLayout的时候,它会调其父视图的layoutSubviews, 而当调用layoutSubviews时,SDAutoLayout使用方法交换,调用sd_layoutSubviews,我们可以看到交换方法的源代码

+(void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSArray *selStringsArray = @[@“setText:”]; [selStringsArray enumerateObjectsUsingBlock:^(NSString *selString, NSUInteger idx, BOOL
*stop) { NSString *mySelString = [@“sd_” stringByAppendingString:selString]; Method originalMethod =
class_getInstanceMethod(self, NSSelectorFromString(selString));
Method myMethod = class_getInstanceMethod(self,
NSSelectorFromString(mySelString));
method_exchangeImplementations(originalMethod, myMethod);
}];
}); }

调用sd_layoutSubviews

// UIView的Category中:
-(void)sd_layoutSubviews {
[self sd_layoutSubviews]; // 此处由于方法交换,调用[self layoutSubviews]
[self sd_layoutSubviewsHandle]; }

sd_layoutSubviewsHandle中,我们知道,看上面图中视图有一个autolayoutModelsArray,它记录着其所有子视图用SDAutoLayout布局的对象,并可以找到每一个子视图所关联着的SDAutoLayout对象,所它来布局。上面谈到,在SDAutoLayout中有left, top, bottom, right等具体的对象,在这些对象中都有一个refView代表其所参照的视图,我们可以把它想像成链表,链表的上一个节点动了,其被参照的视图根据refView找到前一个节点,从而作刷新。

SDAutoLayout API使用比较简单易上手,这里就不赘述了。

SDAutoLayout方法大全,cell自适应

相关文章: