UIPopoverController for iphone无法正常工作?

Rav*_*ran 40 iphone objective-c uipopovercontroller

我需要为我的iPhone应用程序使用UIPopOverController,我搜索stackoverflow有人说UIPopoverController不能在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];
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

Phi*_*Fry 66

您可以在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
Run Code Online (Sandbox Code Playgroud)

2.像往常一样将它导入你的班级并在iPhone中使用popover.

但请记住,这是私有方法,Apple可以拒绝您的应用.但我知道正常使用这个的人和Apple发布他们的应用程序.

  • @QED,不错的尝试,Apple. (11认同)
  • 看起来这个解决方案在iOS 8中被Apple禁用.在我的情况下,应用程序不会崩溃,但popover就像模态视图控制器一样. (9认同)
  • 我在app store中使用此解决方案的应用程序! (3认同)
  • 我已经将类似的演示项目上传到GitHub(如果你无法访问"文件下载"网站)https://github.com/abacomm/UIPopoverController-Hack (2认同)
  • @ PhilipJ.Fry这个逻辑在iOS 8.1及以上版本中不起作用 (2认同)

Ego*_*sev 43

编辑:正如Soberman所述,自iOS 8以来,可以使用公共API在iPhone上呈现弹出窗口,因此这个答案可能不再相关了.


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

Popover控制器仅适用于iPad设备.

因此,遗憾的是,无法在iPhone应用程序中使用此类.但是UIPopoverController提供了一些定制的第三方实现功能,可以添加iPhone支持等等.例如,请参阅https://github.com/50pixels/FPPopover.

编辑:还有另一个高度可定制的popover实现,适用于iPhone/iPad值得一试:https://github.com/nicolaschengdev/WYPopoverController.

  • 从iOS8开始,这个答案已不再适用.看看我的答案,看看如何在iPhone上使用与iPhone相同的popover类在iPhone上进行本地操作. (3认同)

Sob*_*man 29

从iOS8开始,我们现在可以创建弹出窗口,在iPhone上也是如此,就像在iPad上一样,对于那些制作通用应用程序的人来说尤其如此,因此无需制作单独的视图或代码.

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

您需要做的只是子类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.
}
Run Code Online (Sandbox Code Playgroud)

此后,实例化从要显示它并分配两个值的方法新创建的子类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];
Run Code Online (Sandbox Code Playgroud)

而且你有它,漂亮,整洁模糊的popover.

  • 我已经组装了一个演示项目,请看一下:https://github.com/soberman/ARSPopover (4认同)
  • 由于未捕获的异常'NSInvalidArgumentException'消息在iOS7上崩溃终止应用程序,原因:' - [ARSPopover popoverPresentationController]:无法识别的选择器发送到实例0x1649a820 (2认同)

Dan*_*sko 14

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

1.创建您的控制器以呈现

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

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

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

2.实施 adaptivePresentationStyleForPresentationController

默认情况下,UIPopoverPresentationController将在iPhone上以全屏显示,以防止此行为,您需要强制自适应演示文稿样式为none.

首先,我们设置popover表示控制器的委托

vc.popoverPresentationController.delegate = self;
Run Code Online (Sandbox Code Playgroud)

然后我们实施 UIPopoverPresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return .None;
}
Run Code Online (Sandbox Code Playgroud)

3.显示和配置弹出窗口

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

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