Позиционирование CALayer после перемещения объекта - PullRequest
4 голосов
/ 07 сентября 2011

Я анимирую свой UIImageView с помощью CAAnimation, используя свойство layer следующим образом:

    [imageView.layer addAnimation:pathAnimation forKey:[NSString stringWithFormat:@"pathAnimation%@",objId]];

Но в конце моей анимации (после того, как объект переместился из исходной точки), когда я читаю координаты X Y или центра фрейма, они всегда кажутся оригинальными, а не теми, куда переместился объект.

Как прочитать координаты слоя, чтобы определить правильное местоположение моего движущегося объекта?

Вот мой код:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];  
imageView.image = [UIImage imageNamed:@"banner1.jpg"];
imageView.animationDuration = 2;
imageView.animationRepeatCount = 0;
imageView.tag = 100000;

imageView.layer.frame = imageView.frame;

[self.view addSubview:imageView];   
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.duration = 2.0f;
pathAnimation.delegate=self;
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO; 
CGMutablePathRef pointPath = CGPathCreateMutable();
CGPathMoveToPoint(pointPath, NULL, 100, 100);
CGPathAddLineToPoint(pointPath, NULL, 300, 200);
CGPathAddLineToPoint(pointPath, NULL, 200, 150);
pathAnimation.path = pointPath;
CGPathRelease(pointPath);   
[imageView.layer addAnimation:pathAnimation forKey:@"pathAnimation"];
[imageView release];

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Если вы анимируете слой, вид, содержащий слой, останется на том же месте, поэтому кадр останется прежним.слой также имеет свойства frame, bound и position, поэтому попробуйте прочитать свойства layer.

EDIT:

Я нашел следующее объяснение в справочнике по классам CAKeyframeAnimation.

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

, и для того, чтобы узнать, что такое дерево рендеринга, я нашел его здесь.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/CoreAnimationArchitecture.html#//apple_ref/doc/uid/TP40006655-SW1

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

Ниже приведен последний абзац вышеуказанной ссылки.

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

Основываясь на этом, можно обойтись путем расчета новой позиции слоя на основепути, которые вы указали, и соответственно установив свойство фрейма уровня представления.

Пожалуйста, напишите здесь, если вы найдете какое-либо обновление .....

1 голос
/ 19 апреля 2012

Это самоочевидное объявление (CALayer.h):

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

Эффект попытки каким-либо образом изменить возвращенный слой не определен.

sublayers, mask и superlayerсвойства возвращаемого слоя возвращают презентационные версии этих свойств.Это распространяется на методы слоя только для чтения.Например, вызов -hitTest: по результату -presentationLayer запросит значения представления дерева слоев.

- (id)presentationLayer;
...