Как правильно анимировать последовательно с помощью CAAnimation

Я просто закрываю двери, задерживаюсь на 2 секунды / вызываю метод, затем открываю их обратно. Один приходит с левой стороны, а другой с правой стороны. Сначала я использовал блок анимации UIView, но потом понял, что когда пользователь покидает приложение во время анимации, его блок завершения никогда не вызывается.

Я не смог найти никого, кто бы жаловался на такое поведение, когда прерывание происходит во время анимации, и, следовательно, не смогло решить проблему, и теперь я надеюсь, что CAAnimation's animationDidStop или блок завершения CATransaction будет вызван независимо от того, какие 100%.

РЕДАКТИРОВАТЬ

Попробовал приведенный ниже код, и он работал, хотя я не мог заставить задержку работать. (CACurrentMediaTime()+delay приводит к немедленному завершению второй анимации) Самое главное, я рад, что animationDidStop ВСЕГДА вызывается, даже если анимация прерывается. (Блоки завершения анимаций UIView на основе блоков никогда не вызываются, если пользователь покидает приложение, ИЛИ анимация ВК запускается одновременно). Я хотел бы знать, почему это происходит с анимациями UIView и есть ли решение для этого.

Должен ли я придерживаться этого метода и попытаться исправить задержку или предложить какой-то другой подход? CAAnimationGroup в этом случае не работает, потому что animationDidStop вызывается, когда вся группа завершена, и поэтому не может вызывать методы, когда заканчивается первая анимация.

-(void)action {

CABasicAnimation *animDoorLeftClose = [CABasicAnimation animationWithKeyPath:@"position.x"];
animDoorLeftClose.fromValue = [NSNumber numberWithFloat:self.doorLeft0.position.x];
animDoorLeftClose.toValue = [NSNumber numberWithFloat:self.doorLeft0.position.x + self.frame.size.width/2];
animDoorLeftClose.duration = 0.2;
animDoorLeftClose.beginTime = 0.0;
self.doorLeft0.position = CGPointMake(self.doorLeft0.position.x + self.frame.size.width/2, self.doorLeft0.position.y);
[self.doorLeft0 addAnimation:animDoorLeftClose forKey:@"leftClosing"];

CABasicAnimation *animDoorRightClose = [CABasicAnimation animationWithKeyPath:@"position.x"];
[animDoorRightClose setValue:@"doorClosing" forKey:@"id"];
animDoorRightClose.fromValue = [NSNumber numberWithFloat:self.doorRight0.position.x];
animDoorRightClose.toValue = [NSNumber numberWithFloat:self.doorRight0.position.x - self.frame.size.width/2];
animDoorRightClose.duration = 0.2;
animDoorRightClose.beginTime = 0.0;
animDoorRightClose.delegate = self;
self.doorRight0.position = CGPointMake(self.doorRight0.position.x - self.frame.size.width/2, self.doorRight0.position.y);
[self.doorRight0 addAnimation:animDoorRightClose forKey:@"rightClosing"];    }




-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {

if([[anim valueForKey:@"id"] isEqual:@"doorClosing"]) {

            [self.delegate shipTOmap];
    }
    [self doorClosed];
}

else if ([[anim valueForKey:@"id"] isEqual:@"doorOpening"]) {

    [self doorOpened];
}}




-(void)doorClosed {

CABasicAnimation *animDoorLeftOpen = [CABasicAnimation animationWithKeyPath:@"position.x"];
animDoorLeftOpen.fromValue = [NSNumber numberWithFloat:[self.doorLeft0.presentationLayer position].x];
animDoorLeftOpen.toValue = [NSNumber numberWithFloat:[self.doorLeft0.presentationLayer position].x - self.frame.size.width/2];
animDoorLeftOpen.duration = 0.4;
animDoorLeftOpen.beginTime = CACurrentMediaTime()+0.2;
self.doorLeft0.position = CGPointMake([self.doorLeft0.presentationLayer position].x - self.frame.size.width/2, self.doorLeft0.position.y);
[self.doorLeft0 addAnimation:animDoorLeftOpen forKey:@"leftOpening"];

CABasicAnimation *animDoorRightOpen = [CABasicAnimation animationWithKeyPath:@"position.x"];
[animDoorRightOpen setValue:@"doorOpening" forKey:@"id"];
animDoorRightOpen.fromValue = [NSNumber numberWithFloat:[self.doorRight0.presentationLayer position].x];
animDoorRightOpen.toValue = [NSNumber numberWithFloat:[self.doorRight0.presentationLayer position].x + self.frame.size.width/2];
animDoorRightOpen.duration = 0.4;
animDoorRightOpen.beginTime = CACurrentMediaTime()+0.2;
animDoorRightOpen.delegate = self;
self.doorRight0.position = CGPointMake([self.doorRight0.presentationLayer position].x + self.frame.size.width/2, self.doorRight0.position.y);
[self.doorRight0 addAnimation:animDoorRightOpen forKey:@"rightOpening"];
}

0 ответов

Другие вопросы по тегам