2011-04-09 29 views
1

我想利用CALayer提供的隱式動畫,但似乎無法使其工作。在我的視圖控制器中,我聲明瞭一個實例變量CALayer * testLayer。我用這個代碼實例化testLayer。調用removeFromSuperlayer時沒有隱式動畫

- (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

首先,testLayer已經在-viewDidLoad中發佈。當您在-touchesBegin中再次訪問它時,它無效。它所引用的那個層依然存在,但它只能被子層數組保留。你可以改變的代碼來創建一個自動釋放的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層層次結構中移除。請注意,它也會在-touches中發佈,因爲沒有任何東西可以再引用它。您必須重新初始化它,否則在調用-removeFromSuperlayer之前您需要自行保留它。

+0

感謝您的回覆。我嘗試着實現代碼,但是我仍然得到相同的結果。我在一個使用基於視圖的應用程序模板的新項目中僅使用了與此圖層相關的代碼。 – 2011-04-10 21:06:29

+0

但是,如果我更改圖層的位置或不透明度,那麼這些更改會變爲動畫。只有removeFromSuperLayer不起作用。 – 2011-04-10 21:12:44

+0

我認爲在這種情況下你將不得不使動畫不透明。我知道你可以從其超級視圖中移除一個視圖的動畫,但顯然你不能動畫從其超級圖層中移除一個圖層。您可以觀看完成的動畫(-animationDidStop:完成:),然後在該位置實際從其父級移除圖層。或者你可以作弊,只需要調用-performSelector:withObject:afterDelay:傳遞一個延遲值,比你的動畫時間稍長。 – 2011-04-12 01:39:44