Чтобы избежать, чтобы огромная стычка с ужасным UI дала незначительный сбой от представления легкой сдобы после неожиданного вращения, я просто хочу отклонить легкую сдобу в целом, когда это происходит. Однако по любой причине, различным уведомлениям об ориентации, таким как (пустой) willRotateToInterfaceOrientation:duration: не становитесь позвонившими, когда они будут расположены в легкой сдобе. Это мешает закрывать магазин в viewController той легкой сдобы.
a) Почему уведомления об ориентации не происходят в легкой сдобе viewControllers?
b) Что лучший способ состоит в том, чтобы иметь дело с этими вращениями и необходимыми увольнениями?
Обычно ваш главный контроллер представления должен получить уведомление, чтобы вы могли предпринять действия, чтобы заставить другие ваши контроллеры представления выполнять соответствующие действия, в процессе будет регистрироваться для уведомлений о ротации устройства с помощью всплывающего окна и обрабатывать его таким образом.
У меня нет ответа на вопрос (a) выше, но у меня есть рабочее решение, которое может быть применимо к (b)...
Поскольку один из моих popovers - это что-то вроде "Main Menu", я сохранил его в appDelegate. AppDelegate не получает уведомлений о "повороте интерфейса", как таковых, но он слышит об изменении ориентации строки состояния...
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration {
// a cheat, so that we can dismiss all our popovers, if they're open.
if (menuPopoverPC) {
// if we're actually showing the menu, and not the about box, close out any active menu dialogs too
if (menuPopoverVC && menuPopoverVC == menuPopoverPC.contentViewController)
[menuPopoverVC.popoverController dismissPopoverAnimated:YES];
[menuPopoverPC dismissPopoverAnimated:YES];
menuPopoverPC = nil;
}
}
Кроме того, я выяснил одну маленькую хитрость: когда вы делаете эти всплывающие меню в стиле Show/Hide, часто у вас не так много возможностей для очистки после всех увольнений. Это иногда приводит к тому, что пользователю приходится дважды нажимать на кнопку меню, чтобы открыть его. То есть, если вы не настроили свой контроллер как UIPopoverControllerDelegate, то добавьте следующее:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
// the user (not us) has dismissed the popover, let's cleanup.
menuPopoverPC = nil;
}