Ваша проблема связана с тем, что к моменту вызова willRotateToInterfaceOrientation: вращаемое представление уже имеет свой набор свойств ориентации, и блок анимации, обрабатывающий вращение, также готов к работе в отдельном потоке. С документация :
Этот метод вызывается из блока анимации, используемого для поворота представления. Вы можете переопределить этот метод и использовать его для настройки дополнительных анимаций, которые должны появляться во время поворота представления.
Я бы предложил переопределить shouldAutorotateToInterfaceOrientation: метод для запуска анимации перед возвратом YES для поддерживаемых ориентаций:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if (interfaceOrientation == (UIDeviceOrientationPortrait || UIDeviceOrientationPortraitUpsideDown) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
theView.alpha = 0;
[UIView commitAnimations];
} else {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
theView.alpha = 1;
[UIView commitAnimations];
}
return YES;
}
Это должно обеспечить запуск анимации до того, как вы установите ориентацию UIViewController, и запустите анимацию вращения. Возможно, вам придется добавить небольшую задержку, чтобы получить нужный эффект в зависимости от аппаратной скорости устройства.