2009-12-19 50 views
1

我正在實現遊戲應用程序。我在其中使用動畫層。如何在動畫期間找到CAlayer的位置?

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathMoveToPoint(path, NULL, previousValuex, previousValue); 
CGPathAddLineToPoint(path, NULL, valuex, value); 
previousValue=value; 
previousValuex=valuex; 

CAKeyframeAnimation *animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
animation.path = path; 
animation.duration =1.0; 
animation.repeatCount = 0; 
//animation.rotationMode = kCAAnimationRotateAutoReverse; 
animation.calculationMode = kCAAnimationPaced; 

// Create a new layer for the animation to run in. 
CALayer *moveLayer = [imgObject layer]; 
[moveLayer addAnimation:animation forKey:@"position"]; 

現在我想在動畫過程中找到圖層的位置嗎?是否可能?請幫助我。

回答

0

我從來沒有嘗試這樣做,但你應該能夠(可能通過志願?)監測的CALayer的frame財產(或position,或者bounds,或anchorPoint,這取決於你的需要)在動畫過程中。

+1

實際上,在這種情況下這不起作用。雖然您可以觀察圖層的屬性,但它們只反映圖層的開始或結束值,而不是其中的任何值。正如我在我的回答中所闡明的那樣,在動畫時,您需要查看presentationLayer獲取圖層的當前值。 – 2009-12-19 18:34:22

+0

啊,我明白了(正如我指出的,我從來沒有嘗試過我的建議!)。對於它的價值,我已經投票選出了你的答案。如果我需要在將來做類似的事情,很高興知道。 – 2009-12-20 04:12:40

24

爲了在動畫中查找當前位置,您需要查看圖層presentationLayer的屬性。圖層本身的屬性將僅反映隱式動畫的最終目標值或應用CABasicAnimation之前的初始值。 presentationLayer爲您提供您正在動畫的任何屬性的即時價值。

例如,

CGPoint currentPosition = [[moveLayer presentationLayer] position]; 

將讓你的層的當前位置,因爲它是關於動畫的路徑。不幸的是,我認爲在表示層中使用鍵值觀測很困難,所以如果你想跟蹤它,你可能需要手動輪詢這個值。

+0

您是否知道如何獲得presentationLayer的** scale **? '[[presentationLayer valueForKeyPath:@「transform.scale」] floatValue]'返回最終值(而不是當前值)。 – aleclarson 2014-03-30 08:08:04

0

如果您CALayer的是另一種的CALayer裏面,你可能需要申請父的CALayer的的AffineTransform,得到孩子的CALayer像這樣的位置:

// Create your layers 
CALayer *child = CALayer.layer; 
CALayer *parent = self.view.layer; 
[parent addSubLayer:child]; 

// Apply animations, transforms etc... 

// Child center relative to parent 
CGPoint childPosition = ((CALayer *)child.presentationLayer).position; 

// Parent center relative to UIView 
CGPoint parentPosition = ((CALayer *)parent.presentationLayer).position; 
CGPoint parentCenter = CGPointMake(parent.bounds.size.width/2.0, parent.bounds.size.height /2.0); 

// Child center relative to parent center 
CGPoint relativePos = CGPointMake(childPosition.x - parentCenter.x, childPosition.y - parentCenter.y); 

// Transformed child position based on parent's transform (rotations, scale etc) 
CGPoint transformedChildPos = CGPointApplyAffineTransform(relativePos, ((CALayer *)parent.presentationLayer).affineTransform); 

// And finally... 
CGPoint positionInView = CGPointMake(parentPosition.x +transformedChildPos.x, parentPosition.y + transformedChildPos.y); 

這個代碼是基於代碼,我只是在寫父CALayer正在旋轉並且位置正在改變,並且我想要獲得兒童CALayer相對於父母所屬UIView中的觸摸位置的位置。所以這是基本的想法,但我沒有真正運行這個僞代碼版本。