2013-04-01 4 views
0

Я анимация UIImageView с использованием базовой анимации iOS «CABasicAnimation», все работает отлично для меня, но единственная проблема заключается в том, когда я одушевляю позицию, после завершения анимации возвращается в исходное положение, где оно было. как я могу это преодолеть? Мне нужно сохранить UIImageView в перемещенном положении.iOS «CABasicAnimation» приносит компонент в исходное положение после завершения анимации

ПРИМЕЧАНИЕ: Я видел несколько вопросов с успешными ответами относительно этого, но я понятия не имею, почему мой не работает, как они говорят.

After rotating a CALayer using CABasicAnimation the layer jumps back to it's unrotated position

Вот мой пример кода,

CGPoint endPt = CGPointMake(160, 53); 
    CABasicAnimation *anim5 = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [anim5 setBeginTime:CACurrentMediaTime()+0.4]; 
    anim5.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    anim5.fromValue = [NSValue valueWithCGPoint:imgRef.layer.position]; 
    anim5.toValue = [NSValue valueWithCGPoint:endPt]; 
    anim5.duration = 1.5; 
    anim5.speed = 2; 
    [imgRef.layer addAnimation:anim5 forKey:@"position"]; 

    //this is what other answers ask to do 
    [anim5 setFillMode:kCAFillModeForwards]; 
    [anim5 setRemovedOnCompletion:NO]; 

BTW [imgRef.layer setPosition:CGPointMake(160, 53)]; мне не поможет, так как я буду задержки анимации с 4 миллисекунды.

ответ

3

Основная причина в том, что анимация просто переводит свойство между двумя значениями, но фактически не изменяет конечное значение. Вам нужно изменить конечное значение, когда анимация завершена, есть три способа сделать это. 1) Используйте свойство delegate в суперкассе CAAnimation, чтобы получать уведомления о завершении анимации. В этот момент вы можете установить свойство в его конечное значение. См.: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/cl/CAAnimation АнимацияDidStop: завершена: это метод, который вам нужно реализовать на делегате. 2) Установите блок завершения для окружающего CATransaction. Вам нужно будет вручную запустить CATransaction, а не автоматически выполнять CABasicAnimation для вас. См. Так: Objective-C - CABasicAnimation applying changes after animation? 3) См. Комментарий ОМЗ ниже ...

+1

Есть лучший (более простой) способ: http://oleb.net/blog/2012/11/prevent-caanimation-snap-back/ – omz

+0

спасибо, omz, ваше решение исправить мою проблему –

+0

мой тоже спасибо !! – skinsfan00atg

1

Правильный ответ заключается в том, чтобы установить свойство позиции слоя, но, как вы указали, это усложняет работу, потому что вам нужна задержка в 0,4 секунды до изменения позиции. Есть ли причина, по которой вы не могли выполнить задержку сначала, а затем сделать анимацию? Что-то вроде этого:

- (IBAction)didTapMove:(id)sender 
{ 
    [self performSelector:@selector(animate) withObject:nil afterDelay:0.4]; 
} 

- (void)animate 
{ 
    CGPoint endPt = CGPointMake(160, 53); 
    CABasicAnimation *anim5 = [CABasicAnimation animationWithKeyPath:@"position"]; 
    anim5.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
    anim5.fromValue = [NSValue valueWithCGPoint:_imageView.layer.position]; 
    anim5.toValue = [NSValue valueWithCGPoint:endPt]; 
    anim5.duration = 1.5; 
    anim5.speed = 2; 

    [_imageView.layer addAnimation:anim5 forKey:@"position"]; 

    [_imageView.layer setPosition:CGPointMake(160, 53)]; 
} 

Заметил я удалил ваше время начала из анимации, так как задержка происходит в вызове выполнения селектора.

+0

Спасибо @Matt, ваш ответ правильный, но это не то, что я хочу. этот ответ не будет соответствовать моему сценарию, потому что у меня много анимаций вместе, поэтому мне действительно нужно сделать задержку с «CABasicAnimation». –

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