动画结束后是否需要删除CABasicAnimation?

Kex*_*Ari 4 objective-c uiview cabasicanimation ios

我正在像这样设置图层动画以更改背景色:

CALayer *layer = [CALayer layer];
            layer.frame = CGRectMake(0, self.view.bounds.size.height, self.view.bounds.size.width, self.view.bounds.size.height);
            layer.backgroundColor = [UIColor yellowColor].CGColor;
            [self.view.layer insertSublayer:layer atIndex:0];
            [CATransaction begin];
            CABasicAnimation *animation = [CABasicAnimation animation];
            animation.keyPath = @"position.y";
            animation.byValue = @(-self.view.bounds.size.height);
            animation.duration = 0.4;
            animation.fillMode = kCAFillModeForwards;
            animation.removedOnCompletion = NO;
            self.animating=YES;
            [CATransaction setCompletionBlock:^{
                NSLog(@"finished");
                self.view.backgroundColor=[UIColor yellowColor];
                [layer removeFromSuperlayer];
                self.animating=NO;
            }];
            [layer addAnimation:animation forKey:@"slide"];
            [CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

完成后,我将设置UIView的实际背景色,然后删除该层。我是否需要[self.view.layer removeAllAnimations];在完成块中调用类似的内容来删除动画,还是自动删除动画?只考虑内存管理。

mat*_*att 5

没有必要

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
Run Code Online (Sandbox Code Playgroud)

...如果您从一开始就正确地构造了动画和图层。整个舞蹈基于对动画工作原理的古老误解。不幸的是,仍然经常看到它在Internet上浮动,但这是错误的,并且始终是错误的。最好学会正确执行此操作(通过在动画开始时将图层设置为其最终属性值)。


小智 0

我认为在这种情况下你根本不需要删除它。

在完成处理程序中,您将从其超级层中删除该层,并且在其他任何地方都没有保留该层。图层层次结构是唯一保留图层的东西,因此当您从层次结构中删除它时,图层将被释放。

添加到该层的任何动画也应该被释放。