2010-06-17 61 views
1

有時,當將layer.transform設置爲新變換時,我會看到該圖層在其完成的位置閃爍,然後從其當前位置開始動畫到其完成位置。設置layer.transform在結束位置閃爍圖層,然後從當前位置對其進行動畫處理

我不知道這是否相關,但同時我設置了圖層超層上的sublayerTransform。

我真的不知道爲什麼發生這種情況,任何想法將不勝感激。

謝謝。

更新

當我刪除的子變換,不會發生此行爲。

這是我的初始設置。

我避免明確的動作,我sublayerTransform有:

self.actions = [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"sublayerTransform"]; 

此方法將轉換單個層

- (void)setSelectedCover:(int)cover{  
    selectedCover = cover; 

    CoverLayer *coverLayer = [onScreenCovers objectForKey:[NSNumber numberWithInt:cover]]; 

    [CATransaction begin]; 
    [CATransaction setValue:[NSNumber numberWithFloat:0.3f] 
        forKey:kCATransactionAnimationDuration]; 

    coverLayer.transform = flippedUpTransform; 
    [CATransaction commit]; 
} 

這種方法可產生類似效果的滾動(我知道有滾動的更方便的方法,但這是迄今爲止我的需求的最佳實現)只要手指在屏幕上移動,就會調用此方法。

- (void)setScrollOffset:(float)offset absolute:(BOOL)absolute animated:(BOOL)animated{ 
    CATransform3D aSublayerTransform = self.sublayerTransform; 
    scrollOffset = aSublayerTransform.m41; 

    if (absolute) { 
     scrollOffset = offset; 
    }else { 
     scrollOffset += offset; 
    } 

    [self setValue:[NSNumber numberWithInt:scrollOffset] forKeyPath:@"sublayerTransform.translation.x"]; 
} 

另外。我只能在第二代設備(不是3號)上重現這一點,因此它使我認爲這部分是設備性能問題,但我仍然需要解決。

我已經使用CABasicAnimation(顯式動畫)像這樣考慮:

- (void)setSelectedCover:(int)cover{ 
    selectedCover = cover; 

    CoverLayer *coverLayer = [onScreenCovers objectForKey:[NSNumber numberWithInt:cover]]; 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.toValue = [NSValue valueWithCATransform3D:flippedUpTransform]; 
    animation.duration = 0.3f; 

     [coverLayer addAnimation:animation forKey:@"transform"]; 
    } 

這實際工作真的很好,無閃爍!現在唯一的問題是讓它留下來。

因此,我已將此添加動畫:

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

這實際上使得它停留在動畫結束,但我認爲這是很重要的人誰正在研究一種類似的任務要知道添加這兩行只會使表示層保持不變,而不會將其保留到模型層。在我的情況下,如果我想要再次變換圖層,則說明layer.transform = newtransform,並且模型從未更改,我的圖層將在執行顯式動畫之前恢復爲原始變換。

所以我認爲我有一個很好的解決方案來解決轉換問題。我說:

animation.delegate = coverLayer.delegate; 

在我的情況下每一個被動畫層,需要有自己的代表,因爲我可以有多個層在同一時間,因爲動畫的東西,所以快速移動。所以我希望每個層都負責它自己。

這是我在委託中實現的。

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 

    if (flag) { 

    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 
    cover.transform = flippedUpTransform; 
    [CATransaction commit]; 
    [cover performSelector:@selector(removeAllAnimations) withObject:nil afterDelay:0.2]; 

    } 
} 

如果動畫順利完成我取完變換並將其應用到模型本身

不久之後我刪除了明確的動畫,因爲當其他轉換設置,它將運行我最後添加動畫。

This Works。

如果動畫沒有完成,我什麼都不做。我不需要更新模態圖層,因爲被中斷的動畫應該負責拾取這個中斷的位置並確保演示文稿保持不變。

問題在於延遲調用始終保持正確。他們不是,它保持足夠的一致性,但有時候事情可能會稍微偏離。最後我會接受這個解決方案如果我不能進一步糾正它。它只是不那麼光滑...

回答

0

iOS4更新可解決此問題。

0

它會幫助,如果你會顯示你使用的代碼,但有時我看到閃爍發生時代碼動畫屬性(在你的情況下變換)和然後在稍後的運行循環中設置該屬性。發生的事情是,它將動畫添加到它(圖層)兩次。請記住,直接更改非根層屬性將(隱式)爲該屬性設置動畫,除非您禁用動畫。此外,請記住,動畫屬性不會自動設置屬性。如果您使用顯式動畫,確保當你的動畫添加到圖層,使用「改造」爲重點 - 是這樣的:

CABasicAnimation *transformAnim = [CABasicAnimation 
             animationForKey:@"transform"]; 
[transformAnim setToValue:CATransform3DMake...]; 
[transformAnim setDuration:...]; // etc. etc. 

// This next line actually sets the transform 
[transformLayer setTransform:CATransform3DMake...]; 
// This overrides the default animation for animating the transform 
[transformLayer addAnimation:transformAnim forKey:@"transform"]; 

不知道,如果你正在使用顯式的動畫,但是這想到的是什麼。

另外,你是sublayerTransform可能會影響這一點。當你發表評論時會發生什麼?如果你用一些代碼更新你的問題,這可能會有所幫助。

此致敬禮。

+0

感謝您的回覆。 runloop是一個有趣的想法,我還沒有看過這個問題。我爲自己的情況添加了一些代碼和故事,我不介意你的想法。謝謝。 – maxpower 2010-06-18 22:16:37

+0

[coverLayer setTransform:flippedUpTransform];實際上會導致閃爍,當我做一個明確的動畫。我想在動畫完成時設置變形,這在我的更新中,但是在進行所有變形時很難管理。 – maxpower 2010-06-18 22:52:52

+0

如果您像我在示例代碼中那樣設置轉換,會發生什麼情況。看看,如果你沒有真正設置變換,你必須做fillModeForwards和removedOnCompletion的東西,讓它保持在向前的位置,但你還沒有真正設置圖層的變換。在我的示例代碼中,您正在設置圖層本身的變形,但是當您使用「變形」鍵添加動畫時,使用自定義顯式動畫而不是默認圖層來告訴圖層從當前變換動畫到新圖層。那有意義嗎? – 2010-06-21 18:40:58