У меня проблемы с автоматически вращающимися интерфейсами в приложении для iPad. У меня есть класс с именем Switcher
, который наблюдает за уведомлениями о повороте интерфейса, и когда он его получает, он переключает представление в окне, примерно так:
- (void) orientationChanged: (NSNotification*) notice
{
UIDeviceOrientation newIO = [[UIDevice currentDevice] orientation];
if (!UIDeviceOrientationIsValidInterfaceOrientation(newIO))
return;
UIViewController *newCtrl = /* something based on newIO */;
[currentController.view removeFromSuperview]; // remove the old view
[window addSubview newCtrl.view];
[self setCurrentController:newCtrl];
}
Проблема в том, что новый вид не вращается автоматически. Мой обратный вызов автоматического поворота в классе контроллера выглядит так:
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) io
{
NSString *modes[] = {@"unknown", @"portrait", @"portrait down",
@"landscape left", @"landscape right"};
NSLog(@"shouldAutorotateToInterfaceOrientation: %i (%@)", io, modes[io]);
return YES;
}
Но как бы я ни вращал устройство, в журнале я нахожу следующее:
shouldAutorotateToInterfaceOrientation: 1 (portrait)
shouldAutorotateToInterfaceOrientation: 1 (portrait)
… и willRotateToInterfaceOrientation:duration:
вообще не вызывается. Что теперь? Изменение ориентации становится моей наименее любимой частью iPhone SDK… (Я пока не могу проверить код на устройстве, может быть, это ошибка в симуляторе?)
PS. Код подписки выглядит так:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];