【发布时间】:2015-12-10 08:31:34
【问题描述】:
在展示视图控制器之前,我将modalPresentationStyle 属性设置为UIModalPresentationPopover。这将在具有常规水平尺寸类的设备(iPad 和 iPhone 6+ 横向)上运行时将视图控制器显示为弹出框,并在其他设备上显示为模态/全屏。也可以通过覆盖 adaptivePresentationStyleForPresentationController 来覆盖此行为,以便视图控制器在所有设备上显示为弹出框。
我想知道在呈现视图控制器之后是否有可能知道它是否呈现为弹出框?仅查看 size 类是行不通的,因为视图控制器可能会覆盖 adaptivePresentationStyleForPresentationController。
显而易见的答案是,作为程序员,我应该知道我是否覆盖adaptivePresentationStyleForPresentationController,但我想编写一个函数,可以通过传入视图控制器或可能在运行时为任何视图控制器确定这一点UIPopoverPresentationController(或任何其他需要的对象)作为参数。
下面是一些展示视图控制器的代码:
navigationController = (UINavigationController *)[MVSStore sharedInstance].addViewController;
navigationController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:navigationController animated:YES completion:^{}];
UIPopoverPresentationController *popoverController = navigationController.popoverPresentationController;
popoverController.sourceView = self.view;
popoverController.sourceRect = CGRectMake(20, 20, 20, 20); // Just a dummy
popoverController.permittedArrowDirections = UIPopoverArrowDirectionAny;
这是检测视图控制器是否显示为弹出框的当前代码。但如上所述,它只查看不适用于所有情况的尺寸等级。
+ (BOOL)willPresentTruePopover:(id<UITraitEnvironment>)vc {
return ([vc traitCollection].horizontalSizeClass == UIUserInterfaceSizeClassRegular);
}
我在 UIViewController 或 UIPopoverPresentationController(或其他任何地方)中找不到任何可以立即为我提供此信息的属性或函数,但也许我遗漏了什么?
【问题讨论】:
-
只是好奇,你为什么想知道?
-
我会用它来显示或隐藏取消按钮。在弹出窗口的情况下,我不需要显示取消按钮,因为通过点击外部视图控制器会关闭视图控制器。另一个原因是在关闭视图控制器时更新父视图控制器。这目前在父级的 viewWillAppear 和 viewDidAppear 中完成。然而,当子视图控制器显示为弹出框(但它们是模态时)时,不会调用 viewDidAppear 和 viewWillAppear,因此我需要以某种方式处理这种特殊情况。
-
@Markus 我添加了一个答案,显示如何仅在需要时添加取消按钮。
标签: ios iphone ipad uikit popover