iOS调研——Masonry与SDAutoLayout相比较

相比较Masonry与SDAutoLayout,使用心得

使用方法官方demo 都非常清晰,本文仅从原理及对比角度来看使用。

目录:

  • 相比较Masonry与SDAutoLayout
    • 及时刷新依赖性
    • 基本原理
    • 使用便易性
    • 思想
  • SDAutoLayout基本原理
  • Masonry基本原理

相比较Masonry与SDAutoLayout

  1. 及时刷新:SDAutoLayout需要依赖顺序,调换相对位置的控件,需要先写好依赖控件约束,否则无法及时刷新(举例:简书 愤怒的振振)。修改UI而言Masonry更为方便调换控件位置。

  2. 基本原理:SDAutoLayout修改的是frame, Masonry改变的是NSLayoutConstraint

  3. 在写相对多个约束的时候,Masonry有属性直接使用会更容易。而自动计算视图高度和cell时,SDAutoLayout更简单以传入model自动计算布局。

  4. SDAutoLayout:面向对象编程思想。Masonry:链式编程思想(链式编程的方法调用返回的是Block,而且调用完Block之后必然会有返回值(该返回值就是操作对象本身),这样才能链式调用,而且Block的参数就是需要内部对象操作的值. 参考博文

SDAutoLayout

基本原理:

1.sd_layout属性:使用动态关联,扩展UIView, 调用getter方法时sd_layout对象生成,此对象作为view对象的布局控制模块, 每次生成一个sd_layout对象,都把它加为super view的autolayoutModelsArray中,sd_layout对象即SDAutoLyaout的实例,SDAutoLayout下设left, top, bottom, right等对象负责具体的布局

摘自简书:愤怒的振振

属性:topEqualToView
get方法:
- (MarginEqualToView)topEqualToView
{
    if (!_topEqualToView) {
        _topEqualToView = [self marginEqualToViewBlockWithKey:@"equalTop"];
    }
    return _topEqualToView;
}


- (MarginEqualToView)marginEqualToViewBlockWithKey:(NSString *)key
{
    __weak typeof(self) weakSelf = self;
    return ^(UIView *view) {
        SDAutoLayoutModelItem *item = [SDAutoLayoutModelItem new];
        item.refView = view;
        [weakSelf setValue:item forKey:key];
        weakSelf.lastModelItem = item;
        if ([view isKindOfClass:NSClassFromString(@"UITableViewCellContentView")] && ([key isEqualToString:@"equalCenterY"] || [key isEqualToString:@"equalBottom"])) {
            view.shouldReadjustFrameBeforeStoreCache = YES;
        }
        return weakSelf;
    };
}

分析:相当于我们调用懒加载的block来改变frame.(所以多次改变已经用约束布局了都xib后,有时sdautolayout不能改掉布局,或者改变了但是显示并没有及时更新,需要再调用updateLayout甚至需要先 clearlayout)

2.缓存frame


Masonry

基本原理:

1.基于NSLayoutConstraint

2.使用方法为block

3.关于链式编程思想

不考虑调用顺序,只在乎结果,事件分发出去,只要有人监听,就能进行下一步操作,KVO就是这样.对象的方法调用没有参数返回值必须是Block,然后调用Block,Block的返回值就是对象,循环进行再次调用,最终内部传参的对象把结果存储在属性字段中,可以根据函数返回值返回出来,打印最终需要的结果

Deft_MKJing宓珂璟的博客:Masonry链式编程思想的基本思路以及KVO底层的响应式编程

官方sample code ,链式思想:

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];

使用注意点:

  • mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同一对象的约束 否则会报错
  • mas_updateConstraints 针对上面的情况 会更新在block中出现的约束 不会导致出现两个相同约束的情况
  • mas_remakeConstraints 则会清除之前的所有约束 仅保留最新的约束

三种函数善加利用 就可以应对各种情况了

你可能感兴趣的:(iOS)