Board logo

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

作者: look_w    时间: 2019-2-20 18:57     标题: 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的动画;当切换到后台是,系统也会移除当前动画。




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