调用removeFromSuperlayer时没有隐式动画

时间:2011-04-09 21:35:27

标签: ios core-animation

我想利用CALayer提供的隐式动画,但我似乎无法让它工作。在我的视图控制器中,我声明了一个实例变量CALayer * testLayer。我用这段代码实例化了testLayer。

- (void)viewDidLoad {
    testLayer = [[CALayer alloc] init];
    testLayer.bounds = CGRectMake(0, 0, 100, 100);
    testLayer.position = CGPointMake(400, 400);
    [testLayer setBackgroundColor:[UIColor redColor].CGColor];
    testLayer.delegate = self;
    [self.view.layer addSublayer:testLayer];
    [testLayer release];
}

然后在touchesBegan中,我从其超级层中删除该层。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[testLayer removeFromSuperlayer];
}

图层瞬间消失,没有任何动画。如何为此CALayer启用隐式动画?

1 个答案:

答案 0 :(得分:1)

首先,testLayer已在-viewDidLoad中发布。当您在-touchesBegan中再次访问它时,它无效。它引用的那个层仍然存在,但它只被子层数组保留。您可以更改代码以创建自动释放的CALayer,如下所示:

- (void)viewDidLoad {
    testLayer = [CALayer layer];
    testLayer.bounds = CGRectMake(0, 0, 100, 100);
    testLayer.position = CGPointMake(400, 400);
    [testLayer setBackgroundColor:[UIColor redColor].CGColor];
    testLayer.delegate = self;
    [self.view.layer addSublayer:testLayer];
}

现在它实际上将从-touchesBegan中的层次结构中删除。请记住,它也将在-touchesBegan中发布,因为没有任何东西可以继续引用它。您必须重新初始化它,或者在调用-removeFromSuperlayer之前需要自己保留它。