UIPopoverPresentationController在iPhone上显示全屏模式

在iPad UIPopoverPresentationController工作正常,但在iPhone上它总是显示完整的窗口模式popup。 我正在使用以下代码:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MySecondViewController *contentVC = [storyboard instantiateViewControllerWithIdentifier:@"Pop"]; contentVC.modalPresentationStyle = UINavigationControllerOperationPop; // 13 UIPopoverPresentationController *popPC = contentVC.popoverPresentationController; // 14 contentVC.popoverPresentationController.sourceRect =CGRectMake(100, 130, 280, 230); self.navigationController.preferredContentSize = CGSizeMake(200, self.parentViewController.childViewControllers.lastObject.preferredContentSize.height-100); //self.showPop.frame; // 15 contentVC.popoverPresentationController.sourceView = self.showPop; // 16 popPC.permittedArrowDirections = UIPopoverArrowDirectionAny; // 17 popPC.delegate = self; //18 [self presentViewController:contentVC animated:YES completion:nil]; -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; } 

在ViewController.h中首先创build一个UIPopoverPresenatationController属性。

  @property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8; 

然后显示PopOverPresentationcontroller

  UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/ dateVC.preferredContentSize = CGSizeMake(280,200); destNav.modalPresentationStyle = UIModalPresentationPopover; _dateTimePopover8 = destNav.popoverPresentationController; _dateTimePopover8.delegate = self; _dateTimePopover8.sourceView = self.view; _dateTimePopover8.sourceRect = [sender frame]; destNav.modalPresentationStyle = UIModalPresentationPopover; destNav.navigationBarHidden = YES; [self presentViewController:destNav animated:YES completion:nil]; 

你一定注意到我们在呈现视图控制器而不是呈现popOver。所以我们也必须以新的方式隐藏它。当我们点击屏幕时它会自动隐藏。

 -(void)hideIOS8PopOver { [self dismissViewControllerAnimated:YES completion:nil]; } 

我们必须在实现文件中实现UIPopoverPresenatationController的委托。在实现文件中写下如下委托方法。

 - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller { return UIModalPresentationNone; } 

Popover控制器专门用于iPad设备。

编辑:如Soberman所述,自iOS 8以来,可以使用公共API在iPhone上呈现popovers,所以这个答案可能不再相关。

正如Apple在UIPopoverController上的文档所述:

Popover控制器专门用于iPad设备。 所以不幸的是在iPhone应用程序中没有办法使用这个类。 但是有一些自定义的第三方实现由UIPopoverController提供的function,添加了iPhone支持等等。 例如,请参阅https://github.com/50pixels/FPPopover

编辑:还有另一个高度可定制的popup式实施iPhone / iPad价值检查: https : //github.com/nicolaschengdev/WYPopoverController 。