Masonry适配——(5)animation动画的设置

本文介绍了在Masonry框架中如何进行animation动画的设置,包括三种情况:1) 添加约束后更新某个约束并调用layoutIfNeeded;2) 重置所有约束并更新布局;3) 在updateViewConstraints中添加约束并触发更新。详细步骤和示例代码帮助理解实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

githubhttps://github.com/potato512/SYDemo_Masonry

masonry适配中,animation动画的使用通常是需要更新UI,即需要更新约束,或是修改更新某一个约束mas_updateConstraints,又或是移除之前所有的约束,修改所有约束mas_remakeConstraints更新约束后,需要刷新UI布局时,需要调用下面的方法

- (void)setNeedsLayout;
- (void)layoutIfNeeded;
- (void)setNeedsUpdateConstraints;

情况1:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_updateConstraints修改更新某一个约束,然后再调用layoutIfNeeded

// 1 添加约束
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.center.equalTo(self.view);
    make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];

// 2 修改更新约束
[view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(originTop);
    make.left.mas_equalTo(originLeft);
}];

// 3 调用更新
[self.view layoutIfNeeded];

情况2:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_remakeConstraints重置所有约束,然后再调用layoutIfNeeded

// 1 添加约束
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.center.equalTo(self.view);
    make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];

// 2 重置所有约束
[view mas_remakeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(originTop);
    make.left.mas_equalTo(originLeft);
    make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];

// 3 调用更新
[self.view layoutIfNeeded];

情况3:实例化UI后,暂不添加约束,后通过updateViewConstraints方法里添加约束mas_updateConstraints,然后再调用setNeedsUpdateConstraintslayoutIfNeeded

// 1 
- (void)updateViewConstraints
{
    [view mas_updateConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.size.mas_equalTo(self.sizeScale);
    }];

    [super updateViewConstraints];
}

// 2 调用更新
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];


效果图:



// 移动
UIButton *buttonMove = [[UIButton alloc] init];
[self.view addSubview:buttonMove];
[buttonMove mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(10);
        make.left.mas_equalTo(10);
        make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
[buttonMove setTitle:@"移动" forState:UIControlStateNormal];
[buttonMove setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
buttonMove.backgroundColor = RandomColor;
[buttonMove addTarget:self action:@selector(buttonMoveClick:) forControlEvents:UIControlEventTouchUpInside];
- (void)buttonMoveClick:(UIButton *)sender
{
    [self.view bringSubviewToFront:sender];
    
    CGFloat originTop = (arc4random() % ((int)self.view.frame.size.height));
    if (originTop < 10)
    {
        originTop = 10;
    }
    else if (originTop > (self.view.frame.size.height - sender.frame.size.height))
    {
        originTop = (self.view.frame.size.height - sender.frame.size.height);
    }
    
    CGFloat originLeft = (arc4random() % ((int)self.view.frame.size.width));
    if (originLeft < 10)
    {
        originLeft = 10;
    }
    else if (originLeft > (self.view.frame.size.width - sender.frame.size.width))
    {
        originLeft = (self.view.frame.size.width - sender.frame.size.width);
    }
    
    // 修改更新某一个约束
//    [sender mas_updateConstraints:^(MASConstraintMaker *make) {
//        make.top.mas_equalTo(originTop);
//        make.left.mas_equalTo(originLeft);
//    }];
    // 或,移除之前的所有约束,重新设置约束
    [sender mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(originTop);
        make.left.mas_equalTo(originLeft);
        make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
    }];
    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}

// 放大或缩小
UIButton *buttonScale = [[UIButton alloc] init];
[self.view addSubview:buttonScale];
[buttonScale setTitle:@"放大" forState:UIControlStateNormal];
[buttonScale setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
buttonScale.backgroundColor = RandomColor;
[buttonScale addTarget:self action:@selector(buttonScaleClick:) forControlEvents:UIControlEventTouchUpInside];
buttonScale.tag = 1000;
    
// 方法1 先设置约束
[self scaleClick1WithUI:buttonScale];
// 方法2 暂不设置约束
//    [self scaleClick2WithUI];
#pragma mark 方法1

- (void)scaleClick1WithUI:(UIButton *)button
{
    [button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
    }];
}

- (void)scaleClick1:(UIButton *)button
{
    CGSize size = button.frame.size;
    if (size.height >= 160.0)
    {
        isScaleBig = NO;
        [button setTitle:@"缩小" forState:UIControlStateNormal];
    }
    else if (size.height <= 80.0)
    {
        isScaleBig = YES;
        [button setTitle:@"放大" forState:UIControlStateNormal];
    }
    if (isScaleBig)
    {
        size = CGSizeMake(button.frame.size.width * 1.2, button.frame.size.height * 1.2);
    }
    else
    {
        size = CGSizeMake(button.frame.size.width / 1.2, button.frame.size.height / 1.2);
    }
    
    // 仅修改更新某一个约束
//    [sender mas_updateConstraints:^(MASConstraintMaker *make) {
//        make.size.mas_equalTo(size);
//    }];
    // 或,清除之前的所有约束,重新设置约束
    [button mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.size.mas_equalTo(size);
    }];
    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}
#pragma mark 方法2

- (void)scaleClick2WithUI
{
    self.sizeScale = CGSizeMake(80.0, 80.0);
}

- (void)updateViewConstraints
{
    UIButton *button = (UIButton *)[self.view viewWithTag:1000];
    [button mas_updateConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        make.size.mas_equalTo(self.sizeScale);
    }];
    
    [super updateViewConstraints];
}

- (void)scaleClick2:(UIButton *)button
{
    if (self.sizeScale.height >= 160.0)
    {
        isScaleBig = NO;
        [button setTitle:@"缩小" forState:UIControlStateNormal];
    }
    else if (self.sizeScale.height <= 80.0)
    {
        isScaleBig = YES;
        [button setTitle:@"放大" forState:UIControlStateNormal];
    }
    if (isScaleBig)
    {
        self.sizeScale = CGSizeMake(self.sizeScale.width * 1.2, self.sizeScale.height * 1.2);
    }
    else
    {
        self.sizeScale = CGSizeMake(self.sizeScale.width / 1.2, self.sizeScale.height / 1.2);
    }
    
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:0.3 animations:^{
        [self.view layoutIfNeeded];
    }];
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值