Рисование и анимация с помощью UIView или CALayer? - PullRequest
3 голосов
/ 08 апреля 2010

Я пытаюсь реализовать график, который рисует пользовательский интерфейс.Есть 3 UIViews для анимации левого / правого слайда.Проблема в том, что я не могу отменить анимацию UIView.Поэтому я заменил UIViews на CALayer.Теперь вопрос в том, подходит ли CALayer для этого?Нормально ли рисовать на CALayer, как это?И почему CALayer такой медленный, когда я манипулирую свойствами фрейма.

CGRect frame = curve.frame;
frame.origin.x -= diffX;
[curve setFrame:frame];

Есть ли альтернатива?

PS Я немецкий парень.Извините за ошибки.


Я получил анимацию с помощью CATransaction, но теперь я буду анимировать движение топора с помощью CABasicAnimation.Это не проблема, ожидайте, что положение слоя вернется к предыдущему x.

CABasicAnimation *theAnimation; 
theAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
theAnimation.delegate = self;
theAnimation.duration = 1.0;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
CGPoint position = [[curves objectAtIndex:i]position];
position.x = [[curves objectAtIndex:i]position].x - diffX;
[theAnimation setToValue:[NSValue valueWithCGPoint:position]];
[[curves objectAtIndex:i] addAnimation:theAnimation forKey:[NSString stringWithFormat: @"translate.x.%d", index]];

Позиция меняет положение (например, xStart = 100, xEnd = 200), но когда анимация заканчивается, слой выходитвернуться к началу x (например, x = 100).Это нормально?Как я могу решить эту проблему, чтобы конечная позиция больше не менялась?Я попытался изменить свойство removeOnComplete, но это не сработало.

Надеюсь на помощь.

Маркус

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

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

[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
[curve setFrame:frame];
[CATransaction commit];

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

0 голосов
/ 16 сентября 2010

Вместо установки конечной позиции в анимации, просто установите свойство позиции объекта, который вы хотите переместить.

Когда вы добавляете анимацию: анимация, вы устанавливаете «визуальный стиль» любых изменений вуказанное вами свойство keyPath.

Когда вы меняете положение объекта, к которому присоединена анимация, скажем, с (0,0) на (500 500), CoreAnimation будет анимировать это изменение для вас.Объект TheAnimation не нуждается в начальной и конечной позициях, поскольку базовый объект имеет их.

...