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

时间:2015-05-24 16:37:14

标签: ios objective-c uiview cabasicanimation

我正在设置这样的图层以更改背景颜色:

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];

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

2 个答案:

答案 0 :(得分:4)

无需

animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;

...如果您从一开始就正确构建动画和图层。整个舞蹈都是基于对动画如何运作的旧观念。不幸的是,经常看到它漂浮在互联网上,但这是错误的,而且总是错误的。学会正确地做到这一点(通过在动画开始时将图层设置为最终属性值)会更好。

答案 1 :(得分:0)

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

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

添加到图层的任何动画也应该被取消分配。