2012-02-02 51 views
2

我已經寫動畫層,從一個位置移動至另一層:iPhone CAKeyframeAnimation不更新位置屬性?

- (void) animateCentreRightTransition: (int) transition { 
float scaleFactor[2] = {1, 0.8}; 
if (transition == WatchTransitionClockwisePortrait || transition == WatchTransitionClockwiseLandscape) { 
    scaleFactor[0] = 0.8; 
    scaleFactor[1] = 1; 
} 

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.calculationMode = kCAAnimationPaced; 
CGMutablePathRef curvedPath = CGPathCreateMutable(); 
CGPathMoveToPoint(curvedPath, NULL, kCentreRightTrasition[transition][0], kCentreRightTrasition[transition][1]); 
CGPathAddCurveToPoint(curvedPath, NULL, kCentreRightTrasition[transition][2], kCentreRightTrasition[transition][3], kCentreRightTrasition[transition][4], kCentreRightTrasition[transition][5], kCentreRightTrasition[transition][6], kCentreRightTrasition[transition][7]); 
pathAnimation.path = curvedPath; 
CGPathRelease(curvedPath); 

CABasicAnimation *scale = [CABasicAnimation animationWithKeyPath: @"transform.scale"]; 
scale.fromValue = [NSNumber numberWithDouble:scaleFactor[0]]; 
scale.toValue = [NSNumber numberWithDouble:scaleFactor[1]]; 

CAAnimationGroup *group = [CAAnimationGroup animation]; 
group.animations = [NSArray arrayWithObjects:scale, pathAnimation, nil]; 
group.autoreverses = NO; 
group.duration = kWatchTransitionDuration; 
group.repeatCount = 1; 
group.removedOnCompletion = NO; 
group.fillMode = kCAFillModeForwards; 
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
group.delegate = self; 
[self.layer addAnimation:group forKey:@"animateCentreRightTransition"]; 
NSLog(@"Centre right %f", self.layer.position.x); 
NSLog(@"%f", self.layer.position.y); 
} 

但是它似乎是,雖然我的層轉移到新的地方,它的位置屬性保持不變?現在,當我旋轉屏幕,並設置位置座標以適應風景模式時,結果不是我想要的,圖層不會留在我想要的位置。我在這裏錯過了什麼?

回答

4

動畫不會改變圖層的屬性,因此一旦動畫完成並從圖層中移除,通常圖層會移回其初始狀態。

如果您希望圖層在動畫完成後保留其在動畫中的最後位置,則需要在添加動畫之後立即將圖層的位置設置爲該位置。例如:

[self.layer addAnimation:group forKey:@"animateCentreRightTransition"]; 
self.layer.position = somePoint;