iOS以动画的形式更新Masonry约束

简介: iOS以动画的形式更新Masonry约束

前言

  1. iOS Masonry以动画的形式更新约束

应用场景:筛选视图的显示与隐藏的时候带上动画来提升用户体验

  1. 利用dividedBy进行九宫格布局
  2. Masonry约束宽高比的例子demo

I、Masonry以动画的形式更新约束

在改变完约束后,在动画块内,使用方法layoutIfNeeded,可以实现一般普通的动画效果

1.1实现方式

  1. 在改变完约束后,在动画块内,使用方法layoutIfNeeded,可以实现一般普通的动画效果。

image.png

  1. Facebok的动画框架pop

https://github.com/facebookarchive/pop Facebook Pop其实是基于CADisplayLink(Mac平台上使用的CVDisplayLink)实现的独立于Core Animation之外的动画方案

1.2  实现代码

- (void)setupProductCategoryTreeFilterViewHidden:(BOOL)hidden{
    float hiddenTime = 0.5;
    WS(weakSelf);
               if (hidden) {// 隐藏的时候需要dispatch_after hiddenTime,才有动画效果
                   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(hiddenTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                       [weakSelf.ProductCategoryTreeFilterView setHidden:hidden];
                   });
                   [self.ProductCategoryTreeFilterView mas_updateConstraints:^(MASConstraintMaker *make) {
                       make.left.equalTo(weakSelf).offset(kAdjustRatio(SCREENW));
                       make.right.equalTo(weakSelf).offset(kAdjustRatio(SCREENW));
                   }];
               }else{//显示的时候直接设置hidden 即可
                   [weakSelf.ProductCategoryTreeFilterView setHidden:hidden];
                   [self.ProductCategoryTreeFilterView mas_updateConstraints:^(MASConstraintMaker *make) {
                       make.left.equalTo(weakSelf).offset(kAdjustRatio(50));
                       make.right.equalTo(weakSelf).offset(kAdjustRatio(0));
                   }];
               }
//Masonry的以动画的形式更新约束
    [self setNeedsUpdateConstraints];//  // 告诉self约束需要更新
    [self updateConstraintsIfNeeded];//  // 调用此方法告诉self检测是否需要更新约束,若需要则更新,下面添加动画效果才起作用
    [UIView animateWithDuration:hiddenTime animations:^{
        [self layoutIfNeeded];// 更新 frame
    }];
}
  • 核心代码
if (hidden) {// 隐藏
            [self.ProductCategoryTreeFilterView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(weakSelf).offset(kAdjustRatio(SCREENW));
                make.right.equalTo(weakSelf).offset(kAdjustRatio(SCREENW));
            }];
        }else{//显示
            [self.ProductCategoryTreeFilterView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(weakSelf).offset(kAdjustRatio(50));
                make.right.equalTo(weakSelf).offset(kAdjustRatio(0));
            }];
        }
//Masonry的以动画的形式更新约束
    [self setNeedsUpdateConstraints];//  // 告诉self约束需要更新
    [self updateConstraintsIfNeeded];//  // 调用此方法告诉self检测是否需要更新约束,若需要则更新,下面添加动画效果才起作用
    [UIView animateWithDuration:hiddenTime animations:^{
        [self layoutIfNeeded];// gengxin frame
    }];

II、利用dividedBy进行九宫格布局

/**
 Masonry比例用法
 */
- (void)setModel:(QCTtodoContentTableViewCellModel *)model{
    _model = model;
    // 构建子试图
    QCTsubStatusBtnView * lasttmp;
    NSInteger col = 4;// 总列数
    for (int i = 0; i<col; model.models) {
        QCTtodoStatusInfoModel *obj = model.models[i];
        QCTsubStatusBtnView * tmp = [QCTsubStatusBtnView new];
        tmp.model = obj;
        [self addSubview:tmp];
        __weak __typeof__(self) weakSelf = self;
        [tmp mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerY.equalTo(weakSelf);
            make.width.equalTo(weakSelf).dividedBy(col);
//            make.left.equalTo(tmp.mas_width).multipliedBy(i);
            if (i%col == 0) {
                make.left.equalTo(weakSelf);
            }else{
                make.left.equalTo(lasttmp.mas_right);
            }
//            make.centerX.equalTo(tmp.mas_width).multipliedBy(i*2+1);
            make.bottom.equalTo(weakSelf);
            make.top.equalTo(weakSelf);
        }];
        lasttmp = tmp;
        i++;
    }
}

III、Masonry约束宽高比

[self.kuangImgView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(weakSelf.tishiLabel.mas_bottom).offset(kAdjustRatio(0));        
        make.left.right.offset((0));
//multipliedBy
        //dividedBy
        //设置高/宽为388:375.0
     make.height.equalTo(weakSelf.view.mas_width).multipliedBy(388/375.0);
    }];

https://kunnan.blog.csdn.net/article/details/111197419

iOS13扫描证件&银行卡信息识别;身份证识别 (正反) ;矩形边缘识别 ;自定义证件相机 (含demo源码)

image.png

see also

iOS设置tableView的点击事件优先级,低于cell的选中事件【场景:比如筛选视图,监听蒙版的点击事件就隐藏筛选视图】

目录
相关文章
|
iOS开发
iOS 动画绘制圆形
iOS 动画绘制圆形
93 1
|
编译器 iOS开发 异构计算
读iOS核心动画笔记
读iOS核心动画笔记
65 0
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
62 1
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
63 5
|
4月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
73 11
|
5月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
61 7
|
iOS开发
iOS 常用阅读软件打开书籍的转场动画
iOS 常用阅读软件打开书籍的转场动画
103 0
|
8月前
|
iOS开发
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
148 0
|
API iOS开发
iOS 自定义转场动画 UIViewControllerTransitioning
iOS 自定义转场动画 UIViewControllerTransitioning
113 0
|
iOS开发
iOS - 个人中心果冻弹性下拉动画
iOS - 个人中心果冻弹性下拉动画
266 0
iOS - 个人中心果冻弹性下拉动画