executeSelector:withObject:afterDelay вызывается после окончания анимации CALayer
Я хочу выполнить анимацию положения некоторых CALayers. Перед окончанием анимации хочу подтолкнуть другую UIViewController
так что когда я вставляю этот последний контроллер UIView, CALayers
вернулись в исходное положение. Это мой код:
CABasicAnimation *animation4 = [CABasicAnimation animationWithKeyPath:@"position"];
animation4.fromValue = [control.layer valueForKey:@"position"];
CGPoint endPoint4=CGPointMake(512, -305);
animation4.toValue =[NSValue valueWithCGPoint:endPoint4];
animation4.duration=1;
[control.layer addAnimation:animation4 forKey:@"position"];
[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9];
И в goToSolutionViewController
Я имею:
-(void)goToSolutionViewController{
SolutionViewController *solution=[self.storyboard instantiateViewControllerWithIdentifier:@"SolutionViewID"];
[self.navigationController pushViewController:solution animated:NO];
}
Проблема в том, что
[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9]
не вызывается до конца анимации. Так goToSolutionViewController
вызывается через 1,9 секунды вместо 0,9.
Что я могу сделать, чтобы выдвинуть UIViewController до окончания анимации? Или иметь CALayers
вернуться в исходное положение, когда я поп UIViewController
но пользователь не может видеть дорогу назад.
Редактировать: ---
Эта проблема производительности возникает только в первый раз, когда я выполняю анимацию и нажимаю UIViewcontroller. Когда я высовываю это и делаю все снова, производительность так же призрачна. Проблема может быть со временем загрузки UIViewController в первый раз.
1 ответ
Вместо того, чтобы полагаться на время анимации по сравнению с выполнением после задержки, вы должны использовать один из обратных вызовов анимации для вызова вашего метода. Вы можете использовать CATransaction, которая позволит вам использовать блок, или обычные методы делегата.
Использование CATransaction
Оборачивая анимацию (добавляя ее в слой) в транзакции, вы можете использовать блок завершения транзакции.
[CATransaction begin];
// Your animation here...
[CATransaction setCompletionBlock:^{
// Completion here...
}];
[CATransaction commit];
Использование делегатов обратного вызова
Установив себя в качестве делегата анимации, вы получите обратный вызов делегата, когда анимация закончится.
animation4.delegate = self;
И обратный звонок
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
// Completion here..
}