在方向改变时关闭UIPopoverController

时间:2010-07-05 23:19:21

标签: ipad orientation uipopovercontroller

为了避免在突然轮换后从popover的视图中出现丑陋的UI故障,我只想在发生这种情况时完全忽略popover。但是,无论出于何种原因,各种方向通知,例如(void)willRotateToInterfaceOrientation:duration:当它们位于弹出窗口内时不会被调用。这使得很难在popover的viewController中关闭商店。

a)为什么popover viewControllers中不会出现方向通知?

b)处理这些轮换和必要解雇的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

通常,您的主视图控制器应该获取通知,以便您可以在其中执行操作以使其他视图控制器执行适当的操作,正在进行的操作是使用弹出窗口注册设备旋转通知并像这样处理它。 / p>

答案 1 :(得分:1)

我上面的(a)没有答案,但我确实有一个适用于(b)的工作解决方案......

由于我的一个弹出菜单是“主菜单”,我将它存储在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;
}