Masonry的个人理解

最近新开始了一个项目,由于以前 接受的一个 二手的项目,前iOSer全部用的storyboard拖拽的控件,我接手之后开始添加支付功能。

导入支付SDK之后,就出现 SDK 支付界面UI 乱的状态,当时 总结了各种原因,找了好久的问题,但是仍然找不到 BUG所在,后来,想起来一个问题——约束冲突。

所以从完成那个项目之后 ,我再弄的东西,全部我都是打算纯代码来写。虽然效率上要慢好多,但是最起码维护起来方便的多。出现问题的话也比较容易定位问题之所在。


说到纯代码写UI ,本人没用过苹果原生的NSLayoutConstraint 类,因为感觉太过麻烦,所以就放弃了。

不过最近有个比较火的 第三方库 ———Masonry.可以实现自动布局的功能(据说约束类能添加的这个库都能做到,是不是好强大)~

各位朋友可以去找些 相关资料 了解一下,我这里就 说一下我 在使用中的一些 感受。

(本文只是针对Objective-C语言的使用感受,我前两天看了一下mas 作者的话)

Masonry is still actively maintained, we are committed to fixing bugs and merging good quality PRs from the wider community. However if you're using Swift in your project, we recommend using [SnapKit](https://github.com/SnapKit/SnapKit) as it provides better type safety with a simpler API.**

如果swift的话,推荐使用 [SnapKit](https://github.com/SnapKit/SnapKit)


多的不介绍了,here we Go~

一、导入Masonry

1)https://github.com/SnapKit/Masonry  GitHub 上 下载,拖进工程

2)必然是 Cocopod。


二、导入头文件

#import "Masonry.h"


三、尽情的策马奔腾吧~

有几点需要注意:

1、你要对 添加约束有一定的了解。要不然 会出现 少 约束,多 约束 之类的

2、还是上代码吧。(少废话,show me the code!)

- (void)createUI {
    __weak typeof (self) weakSelf = self;
    _headerView = [UIView new];
    _headerView.backgroundColor = [UIColor cyanColor];
    
    [self.view addSubview:_headerView];
    
    [_headerView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(UIScreenSize.width , 0.5*UIScreenSize.height));
        make.top.equalTo(weakSelf.view).with.offset(64);
        make.centerX.equalTo(weakSelf.view);

    }];
}
可以看出,masonry 使用block 来 添加约束,所以 和 addSubView 的时机不一样,

所以:

1.weakSelf 防止循环引用

2、添加约束之前 必须 要把 控件 add 到父视图上。之后 在添加 约束

3、因为创建 控件的时候,没有指定 控件的frame ,所以 布局的时候 别的控件  就不能 根据当前 控件的 frame 来写 布局了(不过既然使用了Mas 了 ,好像也就都不需要 frame 来写了 = =#)

4、Mas 的方法

主要用到的方法  也就 3个

_headerView mas_makeConstraints:<#^(MASConstraintMaker *make)block#>  //添加约束

_headerView mas_updateConstraints:<#^(MASConstraintMaker *make)block#>  // 更新约束

_headerView mas_remakeConstraints:<#^(MASConstraintMaker *make)block#>   //删除约束

5、关于mas_equalTo  和 equalTo

简单来说,

mas_equalTo 比较的是 值

equalTo 比较的是view

如果是多个属性时,必须使用equalTo,例如 make.left.and.right.equalTo(self.view);

ps: and 和 with 是没有作用的,只是为了 使代码 更易读


注意在xib或者storyboard中使用masonry框架相关方法的时候要将use Auto layout选项去掉,否则会不起作用。

关于想给约束改变添加动画。

因为约束的改变是瞬时操作和frame的概念不一样,所以 把约束的代码放在动画的block里是无效的
错!
正确做法是,把约束写在外面面,然后在动画的block中包裹 layoutifneed

想要更新约束时添加动画,就需要调用关键的一行代码:setNeedsUpdateConstraints,这是选择对应的视图中的约束需要更新。

对于updateConstraintsIfNeeded这个方法并不是必须的,但是有时候不调用就无法起到我们的效果。但是,官方都是这么写的,从约束的更新原理上讲,这应该写上。我们要使约束立即生效,就必须调用layoutIfNeeded此方法。看下面的方法,就是动画更新约束的核心代码:

// 告诉self.headerView约束需要更新
[self.headerView setNeedsUpdateConstraints];
// 调用此方法告诉self.headerView检测是否需要更新约束,若需要则更新,下面添加动画效果才起作用
[self.headerView updateConstraintsIfNeeded];

[UIView animateWithDuration:0.3 animations:^{
  [self.headerView layoutIfNeeded];
}];


对!

未完待续

笔者 目前只是 对 Masonry 有了一些 粗略的 认识,以后有新的认知的时候 会接着来补充完整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值