UIImageView исчезает после CAKeyframeAnimation - PullRequest
4 голосов
/ 27 августа 2010

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

- (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 не будет работать в этом случае.

1 Ответ

11 голосов
/ 27 августа 2010

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

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

конечным состоянием преобразования:

[[self layer] setTransform:scale4];

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

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