Я знаю, что это выглядит как огромный вопрос, но не так, не бойтесь его прочитать. В основном это объясняет, как работает материал.Проблемы ориентации UIWindow (два режима UIWindows и ландшафта)
У меня есть два UIWindow
s в моем приложении. Первое - это главное окно, которое создается по умолчанию приложением. Второй - modalWindow
и также создан в делегате приложения.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.modalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.modalWindow.windowLevel = UIWindowLevelStatusBar;
//Other stuff I need
//....
return YES;
}
Основная часть моего приложения - только портрет, но есть один контроллер вида, в котором пользователь может переключаться на альбомную ориентацию. Я слушаю для изменения ландшафта с помощью:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Это прекрасно работает и в методе orientationChanged
я представляю контроллер представления ландшафта. На этом все хорошо. Если я вернусь к портрету, я снова получаю orientationChanged
, и в этот момент я увольняю контроллер ландшафтного вида.
Теперь давайте объясним, как вступает в игру второе окно. Когда в ландшафтном режиме есть действие (просто нажатие кнопки), которое представляет новый контроллер просмотра во втором окне (modalWindow
). Хорошо, давайте объясним это.
Приложение делегат имеет два метода, которые выглядят следующим образом:
- (void)presentActivityOnModalWindow:(UIViewController *)viewController
{
self.modalWindow.rootViewController = viewController;
self.modalWindow.hidden = NO;
}
- (void)modalTransitionFinished:(NSNotification *)notif
{
self.modalWindow.hidden = YES;
self.modalWindow.rootViewController = nil;
}
я называю presentActivityOnModalWindow
через [[[UIApplication sharedApplication] delegate] performSelector....]
. Я знаю, что это не лучшая практика, но она отлично работает. Что касается увольнения, я использую NSNotificationCenter
, чтобы опубликовать уведомление об увольнении. Контроллер представления, который отображается на modalWindow
, поддерживает только портретный режим. Он возвращает YES
в shouldAutorotate
и UIInterfaceOrientationMaskPortrait
в supportedInterfaceOrientations
.
Хорошо объясняю, но теперь мы доходим до проблемы. Когда я поворачиваюсь к пейзажу, всплывает модальное окно, отбрасывает модальное окно и поворачивается назад к портрету. Главное окно все еще находится в ландшафтном режиме, и все выглядит катастрофически.
Я попытался добавить наблюдателя в обоих window
и modalWindow
и протоколирования изменений в frame
и bounds
и вот результаты:
Did finish launching:
window frame {{0, 0}, {320, 568}}
window bounds {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
modalWindow bounds {{0, 0}, {320, 568}}
Rotate to landscape:
window frame {{0, 0}, {568, 320}}
Open activity in landscape:
modalWindow frame {{0, 0}, {320, 568}}
modalWindow frame {{0, 0}, {320, 568}}
Dismiss activity:
none
Rotate back to portrait:
none
Так как это кажется мой window
не вернется к обычному режиму кадра, когда мы получаем обратно в портретный режим. Как это исправить? Если мне нужно предоставить более подробную информацию, не стесняйтесь спрашивать.