Masonry remake更新约束

前言

说到iOS自动布局,有很多的解决办法。有的人使用xib/storyboard自动布局,也有人使用frame来适配。对于前者,笔者并不喜欢,也不支持。对于后者,更是麻烦,到处计算高度、宽度等,千万大量代码的冗余,对维护和开发的效率都很低。

笔者在这里介绍纯代码自动布局的第三方库:Masonry。这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的。

效果图

本节详解Masonry的以动画的形式更新约束的基本用法,先看看效果图:

我们这里初始按钮是一个很小的按钮,点击就不断放大,最大就放大到全屏幕。

核心代码

看下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

@interface RemakeContraintsController ()

@property (nonatomic, strong) UIButton *growingButton;

@property (nonatomic, assign) BOOL isExpanded;

@end

@implementation RemakeContraintsController

- (void)viewDidLoad {

[super viewDidLoad];

self.growingButton = [UIButton buttonWithType:UIButtonTypeSystem];

[self.growingButton setTitle:@"点我展开" forState:UIControlStateNormal];

self.growingButton.layer.borderColor = UIColor.greenColor.CGColor;

self.growingButton.layer.borderWidth = 3;

self.growingButton.backgroundColor = [UIColor redColor];

[self.growingButton addTarget:self action:@selector(onGrowButtonTaped:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:self.growingButton];

self.isExpanded = NO;

}

- (void)updateViewConstraints {

// 这里使用update也是一样的。

// remake会将之前的全部移除,然后重新添加

[self.growingButton mas_remakeConstraints:^(MASConstraintMaker *make) {

make.top.mas_equalTo(0);

make.left.right.mas_equalTo(0);

if (self.isExpanded) {

make.bottom.mas_equalTo(0);

} else {

make.bottom.mas_equalTo(-350);

}

}];

[super updateViewConstraints];

}

- (void)onGrowButtonTaped:(UIButton *)sender {

self.isExpanded = !self.isExpanded;

if (!self.isExpanded) {

[self.growingButton setTitle:@"点我展开" forState:UIControlStateNormal];

} else {

[self.growingButton setTitle:@"点我收起" forState:UIControlStateNormal];

}

// 告诉self.view约束需要更新

[self.view setNeedsUpdateConstraints];

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

[self.view updateConstraintsIfNeeded];

[UIView animateWithDuration:0.3 animations:^{

[self.view layoutIfNeeded];

}];

}

@end

讲解

移除之前的所有约束,然后添加新约束的方法是:mas_remakeConstraints

这里展开与收起的关键代码在这里:

1

2

3

4

5

6

7

if (self.isExpanded) {

make.bottom.mas_equalTo(0);

} else {

make.bottom.mas_equalTo(-350);

}

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

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

1

2

3

4

5

6

7

8

9

10

// 告诉self.view约束需要更新

[self.view setNeedsUpdateConstraints];

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

[self.view updateConstraintsIfNeeded];

[UIView animateWithDuration:0.3 animations:^{

[self.view layoutIfNeeded];

}];

时间: 2024-12-28 16:00:04

Masonry remake更新约束的相关文章

Masonry 动画更新约束

前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 效果图 本节详解Masonry的以动画的形式更新约束的基本用法,先看看效果图: 我们这里初始按钮是一个很小的按钮,点击

Masonry整体动画更新约束

前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 效果图 本节详解Masonry的以动画的形式更新约束的基本用法,先看看效果图: 我们这里初始按钮是一个很小的按钮,点击

Xcode8更新约束

Xcode升级之后就会发现约束设置好,想更新一下约束,看看约束是不是刚刚好,习惯性的去点右下角的更新约束的结果却发现没有更新约束的这一项了,好尴尬. 后来发现原来在Xcode8的约束更新换了一个地方,并不是在原来的右下角那个地方,而是在原来的那一行的最左边,点击即可更新约束,就会看到约束加的是否正确. 附图:

Masonry 代码添加约束

0. 实用于: (1).纯代码写的ui控件(按钮,视图,标签等) (2).xib指向的视图..等 1.在做Masonry的autoLayout之前 一定要先将view添加到superview上 否则会报错:(根据个人的经验:view上的子UI布局一定要在Masonry的autoLayout之后,即先确定view位置) 2.首先在Masonry中能够添加autolayout约束有三个函数 - (NSArray *)mas_makeConstraints:(void(^)(MASConstraint

关于自动布局更新约束方法的总结

1.layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的constraints(Autolayout)去决定subviews的position和size. UIView的子类如果需要对其subviews进行更精确的布局,则可以重写此方法.只有在autoresizing和constraint-based behaviors of subviews不能提供我们想要的

Masonry第三方代码约束

#import "RootViewController.h"#import "Masonry.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. #pragma mark - lab

第三方框架Masonry简述(约束管理)

Masonry链接:https://github.com/SnapKit/Masonry 作用:方便使用代码添加AutoLayout约束(AutoLayout在一定意义上替换了Frame,对Frame的改变变成对约束的操作) 使用步骤: 1.手动添加或者使用Cocoapods添加Masonry框架,并导入头文件Masonry.h 2.将需要添加约束的对象加入到父视图中 3.下面的代码的约束是以父视图为基准点的 以下代码中:使用这种注释方式,可以为属性添加标注,option+左键查看,声明一个Bu

【iOS入门】mesonry 更新约束注意点

练习UI布局 masonry 把下划线View移动左边. 开始时对齐中间的 lable ,点击时移动到对应lable下面. 使用方法: [indicator mas_updateConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(curCurTab); }]; 直接报错: [LayoutConstraints] Unable to simultaneously satisfy constraints. Probably a

使用masonry手写约束

在iOS开发过程中,手写contraints是非常痛苦的一件事情,往往那么一丢丢功能要写大量的代码,非常容易发生错误,并且非常不方便调试.所以只有在不得以的情况下才采用手工方式写contraints,一般都在Storyboard中完成,但Storyboard也是一个坑爹的东东,特别是在SVN协作工作时各种问题不甚其烦:但是后来知道了Masonry,体验了一段时间,非常好用,自此很少再使用storyboard写UI了. 安装Masonry 安装使用Masonry的方式不止一种,但比较推荐的方式是使