iOS present一个viewController后动画失效的问题(4)
- UID
- 1066743
|
iOS present一个viewController后动画失效的问题(4)
既然证明调用了,那么就可以说,切换后台和prensent他们清楚动画的方式不一致。
仔细推敲会发现,上面那句话是错的,因为此时此刻我们并不知道这个Layer是属于谁的。然后我尝试打印出可见view以及superview中的layer,想要看看是哪个layer调用了移除动画的方法。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
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"];
UIView *x = v;
while (x) {
NSLog(@"Layer寻找:%@",x.layer);
x = x.superview;
}
});
重新运行,等待动画执行,切到后台。控制台输出如下:
del07-10[9362:256937] Layer寻找:<CALayer: 0x60000003ac80>
del07-10[9362:256937] Layer寻找:<CALayer: 0x60800003d240>
del07-10[9362:256937] Layer寻找:<CALayer: 0x60800003fde0>
del07-10[9362:256937] Layer寻找:<UIWindowLayer: 0x60800003cb80>
del07-10[9362:256937] -[AppDelegate customMethod]开始
del07-10[9362:256937] self=<CALayer: 0x60800022d240>
del07-10[9362:256937] -[AppDelegate customMethod]结束
经过多次的试验,发现没能找到与调用removeAllAnimations layer相同的layer。很失望啊!
然后各种折腾,最后静下心来,在断点调试中看到了如下信息:
<CALayer:0x60000003ae40; position = CGPoint (0 0); bounds = CGRect (0 0; 0 0); delegate = <UIKeyboardImpl: 0x7f84686238e0; frame = (0 0; 0 0); layer = <CALayer: 0x60000003ae40>>; opaque = YES; allowsGroupOpacity = YES; >
也就是说这个调用removeAllAnimations的layer可能是和键盘的动画有关,虽然我不知道UIKeyboardImpl是个什么东东。
然后我才想起用真机跑一下呢,什么代码都不加,真机里面,切换到后台,没有任何一个layer调用removeAllAnimations。
接着,我在界面上增加了一个UITextField,运行后点击UITextField让键盘弹出,然后切换到后台。
控制台输出如下:
del07-10[1911:634198] Layer寻找:<CALayer: 0x17403b500>
del07-10[1911:634198] Layer寻找:<CALayer: 0x17402d340>
del07-10[1911:634198] Layer寻找:<CALayer: 0x17002f900>
del07-10[1911:634198] Layer寻找:<UIWindowLayer: 0x17002ec40>
del07-10[1911:634198] -[AppDelegate customMethod]开始
del07-10[1911:634198] self=<CALayer: 0x17403df20>
del07-10[1911:634198] -[AppDelegate customMethod]结束
del07-10[1911:634198] -[AppDelegate customMethod]开始
del07-10[1911:634198] self=<CALayer: 0x17403dfc0>
del07-10[1911:634198] -[AppDelegate customMethod]结束
del07-10[1911:634198] -[AppDelegate customMethod]开始
del07-10[1911:634198] self=<CALayer: 0x17403df40>
del07-10[1911:634198] -[AppDelegate customMethod]结束
...//若干次
也就是说我们试验到的调用removeAllAnimations的layer仅仅是和键盘相关的。
ps:在尝试的过程中,也怀疑过是否是present的转场动画会与我们写的冲突,所以系统才移除,尝试时不仅仅将animated设置为了NO,还使用了自定义的转场动画,发现都是不能执行的。
综述
经过这么一番折腾,我们可以知道的是当present一个viewController时,系统会移除该viewController的动画;当切换到后台是,系统也会移除当前动画。 |
|
|
|
|
|