iOS present一个viewController后动画失效的问题(2)
- UID
- 1066743
|
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中就已经不存在了。
当为加动画的代码块设置延迟后,动画就正常执行了。 |
|
|
|
|
|