UIPopoverController iphone不工作?

我需要使用UIPopOverController为我的iPhone应用程序,我searchstackoverflow有人说UIPopoverController不能运行在iphone iphone设备为什么?当我在iPhone设备上运行我得到这个错误的reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

  -(void)btnSetRemainderTapped:(UIButton *)button { setReminderView =[[SetRemainderView alloc]initWithNibName:@"SetRemainderView" bundle:[NSBundle mainBundle]]; setReminderView.contentSizeForViewInPopover = CGSizeMake(setReminderView.view.frame.size.width, setReminderView.view.frame.size.height); setReminderView.delegate = self; popOverController = [[UIPopoverController alloc] initWithContentViewController:setReminderView] ; CGRect rect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 1, 1); [popOverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 

任何人都可以帮助我吗?

编辑:如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 。

你可以在iPhone应用程序中使用popoverController。

1.创build一个类别

 // UIPopoverController+iPhone.h file @interface UIPopoverController (iPhone) + (BOOL)_popoversDisabled; @end // UIPopoverController+iPhone.m file @implementation UIPopoverController (iPhone) + (BOOL)_popoversDisabled { return NO; } @end 

2.像往常一样将其导入到您的课堂并在iPhone中使用popup窗口。

但请记住,这是私人的方法,苹果可以拒绝你的应用程序。 但我知道正常使用这个的人,苹果发布了他们的应用程序。

自iOS8以来,我们现在可以创buildpopup窗口,这与iPad上的一样,对于那些制作通用应用程序的用户来说,这将是特别棒的,因此无需制作单独的视图或代码。

你可以在这里获得这个类以及演示项目: https : //github.com/soberman/ARSPopover

所有你需要做的是UIViewController子类,符合UIPopoverPresentationControllerDelegate协议,并设置所需的modalPresentationStyle以及delegate值:

 // This is your CustomPopoverController.m @interface CustomPopoverController () <UIPopoverPresentationControllerDelegate> @end @implementation CustomPopoverController.m - (instancetype)init { if (self = [super init]) { self.modalPresentationStyle = UIModalPresentationPopover; self.popoverPresentationController.delegate = self; } return self; } - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; //You have to specify this particular value in order to make it work on iPhone. } 

之后,在要显示它的方法中实例化新创build的子类,并为sourceViewsourceRect分配两个更多的值。 它看起来像这样:

 CustomPopoverController *popoverController = [[CustomPopoverController alloc] init]; popoverController.popoverPresentationController.sourceView = sourceView; //The view containing the anchor rectangle for the popover. popoverController.popoverPresentationController.sourceRect = CGRectMake(384, 40, 0, 0); //The rectangle in the specified view in which to anchor the popover. [self presentViewController:popoverController animated:YES completion:nil]; 

而且你有它,很好,整齐模糊的popover。

所以@Sobermans的回答并没有真正解决我的问题从头到尾,所以我想详细介绍一下如何使用文档完成。 这就是说我喜欢使用自己的表示控制器子类来pipe理你想要展示的所有自定义的想法。

1.创build您的控制器来呈现

第一步是实例化你想要呈现的控制器:

 let vc: UIViewController = ... vc.modalPresentationStyle = .Popover vc.preferredContentSize = CGSize(width: CGRectGetWidth(view.bounds)/2, height: 100) 

现在我们有一个带有popover表示风格和任意内容大小的控制器。

2.实现adaptivePresentationStyleForPresentationController

默认情况下, UIPopoverPresentationController将在iPhone上以全屏显示,所以为了防止这种行为,您需要强制自适应演示风格为无。

首先我们设置popup窗口控制器的代表

 vc.popoverPresentationController.delegate = self; 

然后我们实现UIPopoverPresentationControllerDelegate

 func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return .None; } 

3.呈现和configurationpopup窗口

首先,我们需要调用presentViewController然后才能configurationpopover:

 presentViewController(vc, animated:true, completion:nil) if let popover = vc.popoverPresentationController { popover.permittedArrowDirections = .Right | .Left popover.sourceView = button popover.sourceRect = button.bounds } 

使用自定义的popover控制器,例如:

https://github.com/sammcewan/WYPopoverController

(这似乎是我find的最好的支持)。

我最终创build了我的自定义工具提示/ popover类。

可以用任何内容视图初始化,并dynamic调整它的框架。

希望它有帮助。

https://github.com/akeara/AKETooltip

如果你想在Swift中这样做,我相信代码如下:

 extension UIPopoverController { class var _popoversDisabled : Bool { get { return false } } } 

编辑:这是工作在iPhone OS X的Xcode 6testing版4与iOs7.1

这是一个非常有趣的(令人压抑的)线程来阅读。 我无法相信苹果禁止在iPhone上popup对话框,绝对没有理由。

而且,的确,在iOS 8上,如果您尝试解决此限制,它会使您的popup窗口显示为全屏模式对话框。

以下出色的网页描述了“苹果如何作弊”,让自己的iBooks和iTunes应用程序打破自己的规则,允许popup窗口 – 但只是在自己的 iPhone应用程序。

HowAppleCheats

有一个阅读(警告:它会让你讨厌Apple&XCode更多..)

想要解决iOS 8上的“ UIUserInterfaceIdiomPad下未运行时调用的UIPopoverController ”?

简单。

只需进入.plist文件,将Bundle ID更改为“ com.apple.itunesu ”,以使XCode认为您的应用程序实际上是iTunes。

然后你的popup窗口将正常工作。

在这里输入图像描述

(叹。)

这样做的另一种方法是直接添加你的UIViewController到你的屏幕上。

弹出

在这个例子中,我想要一个“帮手屏幕”出现在我的iPhone屏幕上。 这是一个UIViewController ,它存储在它自己的.xib文件中,它有几行添加一个漂亮的边框:

 - (void)viewDidLoad { [super viewDidLoad]; // Give our popup a pretty curved border self.view.layer.borderColor = [[UIColor blueColor] CGColor]; self.view.layer.borderWidth = 1.0; self.view.layer.cornerRadius = 8; } 

为了显示它,我只需创build这个UIViewController一个实例,将其添加到我的屏幕,然后居中:

 -(void)showHelperScreen { if (self.helperScreen == nil) { // Add the popup UIViewController to our screen self.helperScreen = [[HelperViewController alloc] init]; [self.view addSubview:self.helperScreen.view]; } // Center the popup in the middle of the screen CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size; self.helperScreen.view.center = CGPointMake(screenSize.width/2, screenSize.height/2); } 

当然,我还需要添加一些代码来使popup消失,当用户点击它之外,但是这至less表明你可以 (安全地)在iPhone上显示popup窗口,即使你的应用程序没有专门调用iTunes或iBook。

瞧。

希望这会有所帮助,如果有人需要我,我会回到安全,愉快的地方(换句话说,Visual Studio)。