40

我需要为我的 iPhone 应用程序使用 UIPopOverController,我搜索了 stackoverflow,有人说 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];
}

谁能帮我?

4

8 回答 8

65

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

1.创建一个类别

// UIPopoverController+iPhone.h file
@interface UIPopoverController (iPhone)
+ (BOOL)_popoversDisabled;
@end

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

2. 将其导入您的班级并照常在 iPhone 中使用 popover。

但请记住,这是私有方法,Apple 可以拒绝您的应用程序。但我认识一些正常使用它的人,Apple 发布了他们的应用程序。

于 2013-02-15T13:12:33.627 回答
44

编辑:正如 Soberman 所说,由于 iOS 8可以使用公共 API 在 iPhone 上呈现弹出框,所以这个答案可能不再相关。


正如 Apple 关于UIPopoverController的文档中所述:

Popover 控制器专用于 iPad 设备。

所以不幸的是,没有办法在 iPhone 应用程序中使用这个类。但是有几个自定义的第三方实现 UIPopoverController 提供的功能,增加了对 iPhone 的支持等等。例如,请参阅https://github.com/50pixels/FPPopover

编辑:还有另一种高度可定制的用于 iPhone/iPad 的弹出框实现值得一试:https ://github.com/nicolaschengdev/WYPopoverController 。

于 2013-02-09T14:16:11.053 回答
30

从 iOS8 开始,我们现在可以创建弹出框了,这在 iPhone 上和在 iPad 上是一样的,这对于那些制作通用应用程序的人来说尤其棒,因此不需要制作单独的视图或代码。

您可以在这里获得课程和演示项目:https ://github.com/soberman/ARSPopover

您需要做的就是 subclass UIViewController,符合UIPopoverPresentationControllerDelegate协议并设置所需modalPresentationStyledelegate值:

// 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.
}

然后,在要显示它的方法中实例化新创建的子类,并为 和 分配另外两个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];

你有它,漂亮,整洁的模糊弹出框。

于 2015-05-23T22:32:06.530 回答
14

所以@Sobermans 的回答并没有真正为我解决从头到尾的问题,所以我想详细说明我是如何使用docs 完成的。话虽如此,我确实喜欢使用您自己的演示控制器子类来管理您想要展示的所有定制的想法。

1. 创建你的控制器来展示

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

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

现在我们有了一个具有弹出式演示样式和任意内容大小的控制器。

2. 实施adaptivePresentationStyleForPresentationController

默认情况下UIPopoverPresentationController将在 iPhone 上全屏显示,因此为了防止这种行为,您需要将自适应演示样式强制设置为无。

首先我们设置popover展示控制器的delegate

vc.popoverPresentationController.delegate = self;

然后我们实现UIPopoverPresentationControllerDelegate

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

3.呈现和配置弹出窗口

首先我们需要调用presentViewController,然后才能配置弹出框:

presentViewController(vc, animated:true, completion:nil)
if let popover = vc.popoverPresentationController {
    popover.permittedArrowDirections = .Right | .Left
    popover.sourceView = button
    popover.sourceRect = button.bounds
}
于 2015-09-08T08:04:34.743 回答
3

使用自定义弹出框控制器,例如:

https://github.com/sammcewan/WYPopoverController

(这似乎是我找到的最受支持的一个)。

于 2014-09-18T00:02:16.127 回答
1

我最终创建了我的自定义工具提示/弹出框类。

可以使用任何内容视图进行初始化并动态调整其框架。

希望能帮助到你。

https://github.com/akeara/AKETooltip

于 2015-02-08T11:00:30.610 回答
0

如果您想在 Swift 中执行此操作,我相信代码如下:

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

编辑:它在带有 iOs7.1 的 iPhone 上的 Xcode 6 beta 4 中工作

于 2014-07-31T13:39:14.097 回答
0

这是一个非常有趣(且令人沮丧)的阅读主题。我无法相信 Apple 会毫无理由地阻止iPhone 上的弹出对话框。

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

以下出色的网页描述了“Apple 如何作弊”,让其自己的 iBooks 和 iTunes 应用程序打破自己的规则,并允许弹出窗口——但只能来自他们自己的iPhone 应用程序。

苹果如何作弊

读一读(警告:它会让你更讨厌 Apple 和 XCode..)

想要绕过iOS 8 上 的“未在 UIUserInterfaceIdiomPad 下运行时调用的 UIPopoverController ”错误?

简单的。

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

然后您的弹出窗口将正常工作。

在此处输入图像描述

(叹。)

另一种方法是直接将您添加UIViewController到屏幕上。

弹出

在这个例子中,我想要一个“帮助屏幕”出现在我的 iPhone 屏幕上。它是一个UIViewController.xib 文件,它存储在它自己的 .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;    
}

为了显示它,我只需创建一个 this 的实例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);
}

当然,我还需要添加一些代码来使弹出窗口在用户点击它外部时消失,但这至少表明您可以(安全地)在 iPhone 上显示弹出窗口,即使您的应用程序没有被特别调用iTunes 或 iBook。

瞧。

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

于 2015-02-05T10:35:30.303 回答