Закрытие UIPopoverController при изменении ориентации - PullRequest
1 голос
/ 06 июля 2010

Чтобы избежать огромных хлопот с уродливыми сбоями пользовательского интерфейса с точки зрения поповера после неожиданной ротации, я просто хочу полностью отклонить поповер, когда это произойдет.Однако по какой-либо причине различные уведомления об ориентации, такие как (void) willRotateToInterfaceOrientation: duration: не будут вызываться, когда они находятся внутри всплывающего окна.Это затрудняет закрытие магазина внутри viewController этого всплывающего окна.

a) Почему уведомления о ориентации не появляются внутри всплывающих оконных контроллеров представления?

б) Как лучше всего справиться с этими поворотами и необходимыми увольнениями?

Ответы [ 2 ]

1 голос
/ 06 июля 2010

У меня нет ответа на (а) выше, но у меня есть рабочее решение, которое может подойти для (б) ...

Поскольку один из моих всплывающих окон - это что-то вроде «Главного меню», я сохранил его в 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;
}
1 голос
/ 06 июля 2010

Как правило, ваш главный контроллер представления должен получать уведомление, чтобы вы могли предпринять действия для того, чтобы заставить другие ваши контроллеры представления выполнять соответствующие действия, в настоящее время будет происходить регистрация уведомлений о повороте устройства с помощью всплывающего окна и обработка его таким образом.

...