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的子类,并为sourceView
和sourceRect
分配两个更多的值。 它看起来像这样:
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 }
我最终创build了我的自定义工具提示/ popover类。
可以用任何内容视图初始化,并dynamic调整它的框架。
希望它有帮助。
如果你想在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)。