Как найти положение CAlayer во время анимации? - PullRequest
1 голос
/ 19 декабря 2009

Я реализую игровое приложение. В котором я использую слой для анимации.

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"];

Теперь я хочу найти положение слоя во время анимации. Возможно ли это? Пожалуйста, помогите мне.

Ответы [ 3 ]

24 голосов
/ 19 декабря 2009

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

Например,

CGPoint currentPosition = [[moveLayer presentationLayer] position];

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

0 голосов
/ 16 апреля 2014

Если ваш 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, к которому принадлежал родитель. Так что это основная идея, но я не запускал эту версию псевдокода.

0 голосов
/ 19 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...