Board logo

标题: iOS present一个viewController后动画失效的问题(2) [打印本页]

作者: look_w    时间: 2019-2-20 18:56     标题: iOS present一个viewController后动画失效的问题(2)

实际遇到的问题和排查过程
问题描述

上面描述到的问题是我最后简略所总结出的。实际的问题是:同事在一个view的初始化过程中添加了一个动画(CoreAnimation),而这个动画不执行了。
分析过程

    这个时候大家的第一反应肯定是动画是不是写的有问题?于是我在原来加动画的地方写出了另一个动画(确定正确的)然后 command + R 发现然并卵。ps:同事也是试验过其他动画的。
    接着当然就是短暂的懵逼咯,仔细回想是不是忘记了什么,毕竟很久没有写动画相关的代码了,但是怎么想都想不出是为什么。
    接下来想到是不是viewController哪里出了问题,于是找到了viewController的实现代码看了看,嗯,没什么问题。又看了初始化的时候,简单的alloc、init似乎也没什么问题。
    那么问题出在哪里呢?然后我注意到了这个viewController是present出去的,难道说是这个原因?恰巧这是一个可以Push的视图控制器(拥有navigationController),于是改用push方法,发现添加的动画可以执行了!
    但是我还是不知道到底是为什么present的vc不执行动画啊,接下来我直接将一个新创建的viewController(无多余的代码),设置为rootViewController,在这个rootViewController中present出上面描述的含有动画的视图控制器,发现动画还是不执行。
    我又重新创建了一个视图控制器,在viewDidLoad中加入了相关的动画,然后用rootViewController present它,接着运行工程,发现还是不执行。
    为了彻底排除是工程中一些配置所引起的原因,只有重新起一个工程来测试,然而在新的工程中还是不执行,那么至此可以断定,是present导致的动画不执行。
    问题找出来了,那么为什么?突然我想到,以前在做一个持续性动画的时候,发现切换到后台在切换回来后动画就不起作用了,最后经过搜索和验证发现是切换到后台时所有的动画被移除了,那么会不会present有类似的手法移除了动画呢?那怎么验证? 简单的方式就是用dispatch_after。在设置延迟之后,发现动画执行了。下面是代码验证过程:

     - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor grayColor];
        
        v = [[UIView alloc] initWithFrame:CGRectMake(0, 20, 100, 100)];
        v.backgroundColor = [UIColor orangeColor];
        [self.view addSubview:v];
        
        CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath"transform.rotation.z"];
        ani.fromValue = @0;
        ani.delegate = self;
        ani.toValue = @M_PI;
        ani.duration = 2.0;
        ani.repeatCount = HUGE_VALF;
        [v.layer addAnimation:ani forKey"opm"];
        NSLog(@"%@",v);
     
        
    }
     
    - (void)viewWillAppearBOOL)animated {
        [super viewWillAppear:animated];
        NSLog(@"%s  %@",__func__,v);
    }

上述代码中,在添加了动画之后打印了一次v,然后viewWillAppear中也打印了一次v(目的是看看有没有动画在其中),控制台的输出为:

    del07-10[8293:207637] <UIView: 0x7f836fc0b710; frame = (0 20; 100 100); animations = { opm=<CABasicAnimation: 0x6000000340e0>; }; layer = <CALayer: 0x600000034240>>
    del07-10[8293:207637] -[PViewController viewWillAppear:]  <UIView: 0x7f836fc0b710; frame = (0 20; 100 100); layer = <CALayer: 0x600000034240>>

可以清楚的看到,在不加延迟时动画在viewWillAppear中就已经不存在了。
当为加动画的代码块设置延迟后,动画就正常执行了。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0