UIPopoverPresentationController 在 iPhone 上显示全屏模态视图

3
在iPad上,UIPopoverPresentationController运行良好,但在iPhone上,它始终显示全窗口模态弹出框。我正在使用以下代码:
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;
}

https://dev59.com/Q14b5IYBdhLWcg3w7Fgv - gabbler
2个回答

5
在ViewController.h文件中,首先需要声明一个UIPopoverPresentationController的属性。
 @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];

您可能已经注意到,我们现在呈现的是视图控制器而不是弹出窗口。因此,我们需要以新的方式隐藏它。当我们点击屏幕时,它会自动隐藏。
-(void)hideIOS8PopOver
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

我们需要在实现文件中实现UIPopoverPresenatationController的代理。请在实现文件中编写以下代理方法。
- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

2
弹出控制器是专门用于iPad设备的。
编辑:正如Soberman所述,自iOS 8以来,使用公共API可以在iPhone上呈现弹出窗口,因此这个答案可能不再相关。
根据苹果关于UIPopoverController的文档所述:
弹出控制器是专门用于iPad设备的。 因此,很遗憾,在iPhone应用程序中没有办法使用这个类。但是有一些第三方定制实现了UIPopoverController提供的功能,增加了iPhone支持和更多功能。例如:请参阅https://github.com/50pixels/FPPopover
编辑:还有另一个高度可定制的iPhone/iPad弹出窗口实现值得检查:https://github.com/nicolaschengdev/WYPopoverController

当然,谢谢。如果您认为这有助于其他人,请投票支持此问题。谢谢。 - Muhammad Umair
你所提出的问题很老了,但是无论如何我现在会去做。 - amit soni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接