У меня нет ответа на (а) выше, но у меня есть рабочее решение, которое может подойти для (б) ...
Поскольку один из моих всплывающих окон - это что-то вроде «Главного меню», я сохранил его в 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;
}
}
Кроме того, одна маленькая хитрость, которую я выяснил, это то, что всякий раз, когда вы делаете эти поповерные меню в стиле Показать / скрывать, часто у вас нет особой возможности убирать после всех увольнений. Это иногда приводит к появлению кнопки меню, которую пользователь должен дважды щелкнуть, чтобы открыть. То есть, если вы не настроили свой контроллер как UIPopoverControllerDelegate, затем добавьте следующее:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
// the user (not us) has dismissed the popover, let's cleanup.
menuPopoverPC = nil;
}