2010-06-21 53 views
1

我有一個問題,我不明白UIViews和核心動畫。以下是我想要做的:UIView在其圖層被動畫後顯示不正確

  • 一個小視圖以大視圖的形式呈現爲其子視圖之一。
  • 當我點擊該視圖中的按鈕時,視圖應該最小化並移動到指定的CGRect。
  • 然後將視圖從其超級視圖中移除。

我第一次出現,最小化和移動並刪除視圖,一切工作正常。但是,當我再次呈現視圖時,它將顯示在修改後的位置(儘管它應該通過調用theView.frame = CGRectMake(600.0, 160.0, 339.0, 327.0);設置在原始位置),而包含在所有不同的響應者元素(按鈕,文字瀏覽等)看法就好像他們在原來的位置一樣。這就像視圖和圖層通過動畫不同步,我不知道如何讓它們重新同步。

self.view.layer.frame = CGRectMake(600.0, 160.0, 339.0, 327.0);之類的東西沒有得到任何正確的。

我儘量減少並移動下面的動畫代碼給出:

[CATransaction flush]; 
    CABasicAnimation *scale, *translateX, *translateY; 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = delegate; 
    group.duration = duration; 

    scale = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    translateX = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
    translateY = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 

    scale.toValue = [NSNumber numberWithFloat:0.13]; 
    translateX.toValue = [NSNumber numberWithFloat:137.0]; 
    translateY.toValue = [NSNumber numberWithFloat:-290.0]; 

    group.animations = [NSArray arrayWithObjects: scale, translateX, translateY, nil]; 
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO; 

    [theView.layer addAnimation:group forKey:@"MyAnimation"]; 

如何讓層回動畫後有何看法?

回答

2

如果刪除這兩行,會發生什麼情況?

group.fillMode = kCAFillModeForwards; 
group.removedOnCompletion = NO; 

你告訴那些線核心動畫的是,你希望它繼續在動畫的前(最終)狀態顯示。同時,您並未真正將圖層上的變換設置爲具有用於動畫的屬性。這會讓事情看起來不同步。

現在,您將要遇到的問題是,刪除這些行將導致您的變換在動畫完成時恢復到起始狀態。你需要做的是實際上在圖層上設置變形,以便在動畫完成時保持它們的位置。

另一種方法是將兩行保留並實際顯式從層中刪除動畫,而不是像您剛纔提到的那樣設置圖層框架,以便恢復到原始狀態。你這樣做:

[theView.layer removeAnimationForKey:@"MyAnimation"]; 

-removedOnCompletion屬性告訴圖層在完成時不刪除動畫。現在你可以明確地刪除它,它應該恢復。

HTH。

+0

哇,那'removeAnimationForKey:'正是我的代碼中所缺少的。謝謝,它現在效果很好! – KPM 2010-06-23 10:53:16