2009-12-19 2 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

Я никогда не пытался сделать это, но вы должны быть в состоянии (возможно, через КВО?) Контролировать frame свойство CALayer (или position или bounds или anchorPoint, в зависимости от того, что вам нужно) во время анимации.

+1

На самом деле, в этом случае это не сработает. Хотя вы можете наблюдать свойства слоя, они отражают только начальные или конечные значения для слоя, а не что-то среднее между ними. Как я поясню в своем ответе, вам нужно будет взглянуть на презентационный слой для текущих значений слоя во время его анимации. –

+0

Ahh, я вижу (как я уже отмечал, я никогда не пробовал, что предлагаю!). Для чего это стоит, я проголосовал за ваш ответ. Хорошо знать, если мне понадобится сделать что-то подобное в будущем. –

24

Чтобы найти текущую позицию во время анимации, вам необходимо просмотреть свойства слоя presentationLayer. Свойства самого слоя будут отражать только конечное целевое значение для неявной анимации или начальное значение до применения CABasicAnimation. presentationLayer дает мгновенное значение любого свойства, которое вы анимируете.

Например,

CGPoint currentPosition = [[moveLayer presentationLayer] position]; 

получит текущее положение слоя, как это оживляющее о вашем пути. К сожалению, я считаю, что с использованием уровня представления сложно использовать наблюдение за ключевыми значениями, поэтому вам может потребоваться вручную опросить это значение, если вы хотите его отслеживать.

+0

Возможно, вы знаете, как получить ** шкалу ** в презентационном слое? '[[presentationLayer valueForKeyPath: @" transform.scale "] floatValue]' возвращает окончательное значение (а не текущее). – aleclarson

0

Если CALayer находится внутри другого CALayer вам, возможно, придется применить AffineTransform родительского CALayer, чтобы получить позицию ребенка 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, к которому принадлежал родитель. Итак, это основная идея, но на самом деле я не запускаю эту псевдокодную версию.

Смежные вопросы