Как правильно анимировать последовательно с помощью 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"];
}