2011-05-07 68 views
6

閱讀演示文稿位置暫停時是否存在問題?我想暫停並恢復CALayer。一旦CALayer暫停,我想用它當前的顯示位置更新圖層的位置。 當我嘗試這樣做時,一旦恢復圖層,圖層會輕微閃爍。圖層暫停時更新CALayer位置是否存在問題?

這是我使用的暫停和恢復CALayer(根據蘋果提供的Technical Q&A QA1673)的代碼:

CFTimeInterval pausedTime; 
void pauseLayer(CALayer *layer) 
{ 
    pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
    layer.speed = 0.0; 
    layer.timeOffset = pausedTime; 
    layer.beginTime = 0; 
// layer.position = ((CALayer*)[layer presentationLayer]).position; 
} 
void resumeLayer(CALayer *layer) 
{ 
    layer.speed = 1.0; 
    layer.timeOffset = 0.0; 
    layer.beginTime = 0.0; 

    CFTimeInterval _elapsedTimeSincePaused = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
    layer.beginTime = _elapsedTimeSincePaused; 
} 

如果我取消在pauseLayerlayer.position = ((CALayer*)[layer presentationLayer]).position;,層閃爍一次,我打電話resumeLayer

這是我的動畫代碼:

- (void) startAnimation:(id)sender 
{ 
    layer10Animation = [CABasicAnimation animationWithKeyPath:@"position.x"]; 
    layer10Animation.duration = 1; 
    layer10Animation.toValue = [NSNumber numberWithInt:300]; 
    layer10Animation.fromValue = [NSNumber numberWithInt:20]; 
    layer10Animation.repeatCount = 100; 
    layer10Animation.autoreverses = YES; 

    [layer10 addAnimation:layer10Animation forKey:nil]; 
} 

問候

+1

你是什麼意思的忽悠做?圖層是否消失然後突然出現,或者它是否與相對於暫停位置的偏移繼續? – MiguelB 2011-07-19 16:18:47

+0

圖層消失,然後突然重新出現。 – haroldcampbell 2011-10-05 14:23:38

回答

4

這裏沒有用,而它的暫停更新CALayer位置的問題。當然,它會給你提到的閃爍。這是因爲你正在更新圖層在動畫中的位置。

不要忘記,創建一個CABasicAnimation並將其添加到CALayer不會更改圖層的設置。它使用圖層創建動畫,但它不會更改圖層。

這就是爲什麼在動畫完成後,您會看到圖層回到原來的位置。

因此,如果您是從動畫化層B,如果希望層的動畫結束後,在B點出現,你需要這樣的委託回調:

- (void)animationDidStart:(CAAnimation *)theAnimation 
{ 
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 
    myLayer.position = targetPosition;  
    [CATransaction commit]; 
} 

沒錯,這是animationDidStart。如果我們使用animationDidStop來做,那麼你會看到另一個閃爍。該圖層將位於B的動畫結束位置,然後在A處看到它的閃爍,然後再次在B處看到它。

使用animationDidStart我們將位置設置爲targetPosition,即B,因爲那是我們希望在完成時看到它的位置。

現在,關於QA1673,您正在做的是將動畫速度設置爲零,並獲取當前CACurrentMediaTime()的時間戳。在簡歷中,您將速度恢復正常,並應用暫停時間內發生的任何偏移量。

這一切似乎相當混亂,直到你得到它的hang hang。我可以推薦一些閱讀和視頻嗎?

肯定有讀取Core Animation Rendering Architecture。這是高度推薦

影片有:

WWDC 2010 Sessions 424 and 425 Core Animation in Practice Parts 1 and 2

WWDC 2011 Session 421 Core Animation Essentials

Developer Videos Session 716 Core Animation Techniques for iPhone and Mac