当前位置: 首页 > news >正文

关于Autolayout制作动画的坑

需求

一直以来iOS的 Autolayout 都是一个很不错的功能,结合第三方 Masonry 可以节省很多工作成本。但是如果使用 Autolayout 来制作动画,那么就需要注意一下。不然就会像我一样,遇坑踩坑,越陷越深。

使用xib实现动画

使用情景:自定义一个UIView ViewA,实现由下往上弹窗效果。

效果如下

假如我们是使用xib创建自定义弹窗视图,一般我们都会在xib上做好了约束的条件,之后在.m文件里面实现视图的初始化操作。

实现动画的原则是,在ViewA执行动画之前,需要将ViewA最终约束条件设置好,之后在执行动画代码块里面只需要调用layoutIfNeeded即可。

另外调用layoutIfNeeded方法的对象必须是ViewA的父视图,不然会出现ViewA的子视图跟着执行动画的情况。

如下面的代码中,ViewA的父视图就是window,所以调用layoutIfNeeded方法的对象是window

- (instancetype)init {
    self = [[[NSBundle mainBundle] loadNibNamed:@"DDJoinView" owner:self options:nil] lastObject];
    if (self) {
        self.frame = CGRectMake(0, kScreenHeight, kScreenWidth, 195);
    }
    return self;
}
- (void)show {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    _bgView = [[UIButton alloc] init];
    _bgView.backgroundColor = UIColorHex(0x000000);
    _bgView.alpha = 0.25;
    _bgView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
    [_bgView addTarget:self action:@selector(close:) forControlEvents:UIControlEventTouchUpInside];
    [window addSubview:_bgView];
    [window addSubview:self];
    [self mas_updateConstraints:^(MASConstraintMaker *make) {
        (void)make.left;
        (void)make.centerX;
        make.height.offset(195);
        make.bottom.offset(0);
    }];
    [UIView animateWithDuration:0.3f animations:^{
        [window layoutIfNeeded];
    }];
}
#pragma mark - 關閉
- (void)close:(id)sender {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    [self mas_updateConstraints:^(MASConstraintMaker *make) {
        (void)make.left;
        (void)make.centerX;
        make.height.offset(195);
        make.bottom.offset(195);
    }];
    [UIView animateWithDuration:0.3f animations:^{
        [window layoutIfNeeded];
    } completion:^(BOOL finished) {
        for (UIView *v in [self subviews]) {
            [v removeFromSuperview];
        }
        [self removeFromSuperview];
        [_bgView removeFromSuperview];
    }];
}
复制代码

总结

//...
//执行下面动画前,设置自定义view的最终位置的约束条件
//...
[UIView animateWithDuration:0.3f animations:^{
        [xxx layoutIfNeeded];
    } completion:^(BOOL finished) {
        //do something
}];
复制代码

再一次感谢您花费时间阅读这篇文章!

微博: @Danny_吕昌辉
博客: SuperDanny

相关文章:

  • iOS解析HTMl标签以及开发中的一些坑
  • iOS10判断摄像机是否可用
  • Android类似微信图片选择器
  • 使用MaxCompute搭建社交好友推荐系统
  • C 标准库 - stdio.h
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • linux学习笔记四
  • 如何优雅地为Struts2的action加监控日志
  • Oracle12C_____处理数据库01033连接错误问题.sql
  • Mac 10.12安装远程桌面工具TeamViewer
  • NGUI_Toggle
  • dubbo源码—dubbo简介
  • 浏览器缓存机制分析
  • centos7部署redis
  • Code First开发系列之领域建模和管理实体关系
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Akka系列(七):Actor持久化之Akka persistence
  • axios 和 cookie 的那些事
  • iOS | NSProxy
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript HTML DOM
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel5.4 Queues队列学习
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • ReactNativeweexDeviceOne对比
  • vue-router的history模式发布配置
  • Wamp集成环境 添加PHP的新版本
  • 成为一名优秀的Developer的书单
  • 大数据与云计算学习:数据分析(二)
  • 二维平面内的碰撞检测【一】
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前嗅ForeSpider采集配置界面介绍
  • 数组大概知多少
  • 我这样减少了26.5M Java内存!
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 说说我为什么看好Spring Cloud Alibaba
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (九十四)函数和二维数组
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)C#调用WebService 基础
  • .a文件和.so文件
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net Core 中间件验签
  • .net打印*三角形
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net语言中的StringBuilder:入门到精通
  • //解决validator验证插件多个name相同只验证第一的问题
  • @DataRedisTest测试redis从未如此丝滑
  • [145] 二叉树的后序遍历 js
  • [android] 手机卫士黑名单功能(ListView优化)
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型