2010-08-27 2 views
4

Я пытаюсь использовать этот код (найденный в ответе здесь на SO) в категории на UIView и использовать его для формирования «поп-анимации» в UIImageView, вложенном внутри UITableViewCell.UIImageView исчезает после CAKeyframeAnimation

- (void)attachPopUpAnimation 
{ 
    CAKeyframeAnimation *animation = [CAKeyframeAnimation 
     animationWithKeyPath:@"transform"]; 

    CATransform3D scale1 = CATransform3DMakeScale(0.5, 0.5, 1); 
    CATransform3D scale2 = CATransform3DMakeScale(1.2, 1.2, 1); 
    CATransform3D scale3 = CATransform3DMakeScale(0.9, 0.9, 1); 
    CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1); 

    NSArray *frameValues = [NSArray arrayWithObjects: 
     [NSValue valueWithCATransform3D:scale1], 
     [NSValue valueWithCATransform3D:scale2], 
     [NSValue valueWithCATransform3D:scale3], 
     [NSValue valueWithCATransform3D:scale4], 
     nil]; 
    [animation setValues:frameValues]; 

    NSArray *frameTimes = [NSArray arrayWithObjects: 
     [NSNumber numberWithFloat:0.0], 
     [NSNumber numberWithFloat:0.5], 
     [NSNumber numberWithFloat:0.9], 
     [NSNumber numberWithFloat:1.0], 
     nil];  
    [animation setKeyTimes:frameTimes]; 

    animation.fillMode = kCAFillModeForwards; 
    animation.removedOnCompletion = NO; 
    animation.duration = 0.2; 

    [self.layer addAnimation:animation forKey:@"popup"]; 
} 

Анимация работает правильно, но когда она заканчивается, она исчезает. Я нашел ответы на другие с этой проблемой, но, по-видимому, установка fillMode не будет работать в этом случае.

ответ

11

Не используйте эти две линии. Вместо этого на самом деле установите преобразование на слой. Заменить эти две строки:

animation.fillMode = kCAFillModeForwards; 
animation.removedOnCompletion = NO; 

с окончательным преобразованием государства:

[[self layer] setTransform:scale4]; 

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

[[self layer] addAnimation:animation forKey:@"transform"]; 
+0

Это опечатка? '[[self layer] setTransform: [NSValue valueWithCATransform3D: scale4]];' выдает синтаксическую ошибку, говорящую «Нет жизнеспособного преобразования из NSValue в CATransform3D». Разумеется, упаковка NSValue должна использоваться только при настройке fromValue и toValue? – Echelon

+0

Действительно. Не знаю, как это прошло так незаметно. Благодарю. Исправлено. –

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