Я задаю этот вопрос в службу технической поддержки Apple Developer, они сказали:
«Основная проблема заключается в том, что из-за времени вашей анимации отсутствует« предыдущее »состояние для анимации Core Animation, так какпредставление было только что добавлено в иерархию представления, и поэтому при попытке перехода все, что он может сделать, это отобразить «конечное» состояние.
Если вместо этого выполнить переворот на следующей итерации цикла выполнения, тогда CoreАнимация успела создать начальное состояние для слоя представления, и, таким образом, переворот будет происходить правильно. Это можно сделать, разделив метод flip на две части и используя -performSelector: withObject: afterDelay: например так: "
-(IBAction)flip {
UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:fromView.image];
dummyImageView.frame = fromView.frame;
[window addSubview:dummyImageView];
[self performSelector:@selector(animate:) withObject:dummyImageView afterDelay:0.0];
}
-(void)animate:(UIView*)view {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: view cache:YES];
[UIView commitAnimations];
}
Однако, поскольку вы упоминаете, что «fromView» является UIImageView, мне интересно, почему вы используете -renderInContext: - более эффективно просто использовать то же изображение, которое использует «fromView», и назначить его в качествеизображение для вашего нового UIImageView, так как это экономит время процессора и память, тем более что я замечаю в васПример, что изображение меньше, чем изображение, которое вы используете.