2015-04-04 4 views
0

Я использую CAKeyframeAnimation для перемещения CALayer по траектории круга. Иногда мне нужно остановить анимацию и переместить анимацию в точку остановки анимации. Здесь код:CAKeyFrameАнимация уровня представления кажется не изменяться

CAKeyframeAnimation* circlePathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
CGMutablePathRef circularPath = the circle path; 

circlePathAnimation.path = circularPath; 
circlePathAnimation.delegate = self; 
circlePathAnimation.duration = 3.0f; 
circlePathAnimation.repeatCount = 1; 
circlePathAnimation.fillMode = kCAFillModeForwards; 
circlePathAnimation.removedOnCompletion = NO; 
circlePathAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:.43 :.78 :.69 :.99]; 
[circlePathAnimation setValue:layer forKey:@"animationLayer"]; 
[layer addAnimation:circlePathAnimation forKey:@"Rotation"]; 


- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 
{ 
    CALayer *layer = [anim valueForKey:@"animationLayer"]; 
    if (layer) { 
     CALayer *presentationLayer = layer.presentationLayer; 
     layer.position = presentationLayer.position; 
    } 
} 

Но слой презентации не имеет изменений в положении !!! Я читал, что он больше не надежен от ios 8. Так есть ли другой способ найти текущую позицию анимированного слоя?

+1

Я получил положение (на самом деле, frame.origin) анимационных объектов, используя слой представления в iOS 8, и, похоже, он работал нормально. Можете ли вы предоставить ссылку на то, где вы читаете, что она более не надежна? Я тестировал его с помощью presentationLayer.position, и это тоже сработало. – rdelmar

ответ

1

Я не знал, что свойство position слоя презентации перестало говорить вам о местоположении вашего слоя в iOS 8. Это интересно. Хит-тестирование с использованием метода hitTest на уровне представления все еще работает, я просто попробовал его в приложении, которое я написал некоторое время назад.

Приостановка и возобновление анимации также по-прежнему работает.

Для простого пути, такого как круговой путь, вы можете проверить время анимации, а затем вычислить позицию с помощью триггера.

Для более сложных путей вы должны знать о пути, по которому проходил ваш слой. Построение одной кубической или квадратичной кривой Безье с течением времени довольно просто, но сложный UIBezierPath/CGPath со смесью разных форм в нем будет медведем, чтобы понять.