Как получить решение для остановки / возобновления работы CABasicAnimation? - PullRequest
7 голосов
/ 05 августа 2011

Я использую CABasicAnimation для вращения UIImageView и не могу возобновить приостановленную анимацию.Анимация начинается в методе viewDidLoad:

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MyImage.png"]];
self.myImage = img;
[self.view addSubview:img];
[img release];
CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
fullRotation.fromValue = [NSNumber numberWithFloat:0];
fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
fullRotation.duration = 10;
fullRotation.repeatCount = LARGE_VAL;
[img.layer addAnimation:fullRotation forKey:@"360"];

Мне нужна непрерывная повторяемая анимация, которая возобновляется, когда вид появляется на экране.Итак, я прочитал этот пост ( здесь ), и реализованное решение предоставило мое яблоко ( решение ) для остановки и возобновления анимации слоя.Итак, я использовал эти методы:

-(void)pauseLayer:(CALayer*)layer{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CALayer*)layer{
    CFTimeInterval pausedTime = [layer timeOffset];
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = timeSincePause;
}

И я добавил эти методы к viewWillAppear и viewWillDisappear, используя и передавая слой свойства myImage:

-(void)viewWillDisappear:(BOOL)animated{
    [self pauseLayer:self.myImage.layer];
}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self resumeLayer:self.myImage.layer];
}

Изображение выполняет начальный повороткогда вид переходит на экран.Но затем я помещаю некоторый UIViewController на экран, затем возвращаюсь к виду с поворотом изображения.Проблема в том, что поворот изображения не возобновляется, когда вид появляется на экране.Я проверил: мое свойство UIImageView изображения не равно nil, и методы viewWillDisappear и viewWillAppear вызываются.Но анимация не возобновляется.Я что-то не так или что-то упустил?

Ответы [ 3 ]

34 голосов
/ 11 апреля 2012

У меня была такая же проблема с твоей.После долгих поисков ... у меня есть решение.

В вашем случае, просто добавьте следующий код, когда вы установите CABasicAnimation:

fullRotation.removedOnCompletion = NO;

Вот и все.Я надеюсь, что это сработает для вас.

6 голосов
/ 05 августа 2011

Обходные пути, обходные пути и обходные пути.Пока что решение, которое я получил, состоит в том, чтобы отбросить предлагаемое решение для остановки / возобновления анимации слоя :), удалить все анимации в viewWillDisappear:

[self.myImage.layer removeAllAnimations];  

и затем запустить новую анимацию вviewWillAppear.Я знаю, что не возобновляю старое, но в моем случае это не так хорошо видно человеческому глазу, поэтому я думаю, что у меня все будет хорошо.Но если у кого-то есть решение, предоставленное Apple, заработало, пожалуйста, поделитесь.

0 голосов
/ 05 августа 2011

Я думаю, что ваша проблема в управлении памятью.

Попробуйте вместо этого:

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MyImage.png"]];
self.myImage = img;
[img release];

CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
fullRotation.fromValue = [NSNumber numberWithFloat:0];
fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
fullRotation.duration = 10;
fullRotation.repeatCount = LARGE_VAL;
[self.myImage.layer addAnimation:fullRotation forKey:@"360"];

[self.view addSubview:self.myImage];

Скажите, работает ли это.

...