在 iOS8 中: UIPopoverController presentPopoverFromRect 不再适用于 keyWindow

Posted

技术标签:

【中文标题】在 iOS8 中: UIPopoverController presentPopoverFromRect 不再适用于 keyWindow【英文标题】:in iOS8: UIPopoverController presentPopoverFromRect not work for keyWindow any more 【发布时间】:2014-07-27 00:20:04 【问题描述】:

如标题所示,在 ios8 中,[UIPopoverController presentPopoverFromRect] 不再适用于 [UIApplication sharedApplication].keyWindow。 (它在 iOS7 中确实有效)

我验证了以下代码:

TestViewController *test = [[TestViewController alloc] initWithNibName:nil bundle:nil];

if (testPopoverController == nil) 
    testPopoverController = [[UIPopoverController alloc] initWithContentViewController:test];
    testPopoverController.popoverContentSize = CGSizeMake(250, 95*5);




CGPoint point = [sender convertPoint:CGPointMake(0, 0) toView:nil];
CGRect rect = CGRectMake(point.x, point.y, 24, 24);

[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

【问题讨论】:

你想问的应该是在iOS 8中应该怎么做吧? 我也遇到了这个问题,有什么解决办法吗? 嘿...你得到这个答案了吗? 它最后对我有用..检查我的答案 【参考方案1】:

我想出的最佳解决方案是有条件地处理它。如果在 iOS 7 上,请使用我们在关键窗口上呈现 UIPopoverController 的工作代码。如果在 iOS 8 上,请使用以下内容:

     viewController.modalPresentationStyle = UIModalPresentationPopover;
     UIPopoverPresentationController *presentationController = viewController.popoverPresentationController;
     [presentationController setDelegate:self];
     presentationController.permittedArrowDirections = 0;
     presentationController.sourceView = [[UIApplication sharedApplication] keyWindow];
     presentationController.sourceRect = [[UIApplication sharedApplication] keyWindow].bounds;

     [viewController setPreferredContentSize:CGSizeMake(320, 480)];
     [parentController presentViewController:viewController animated:YES completion:nil];

这最终与以下功能相同:

     self.popoverController = [[UIPopoverController alloc] initWithContentViewController:viewController];
     [self.popoverController setDelegate:self];
     [self.popoverController setPopoverContentSize:isLandscape() ? CGSizeMake(480*2, 320*2) : CGSizeMake(320*2, 480*2)];
     [self.padPopover presentPopoverFromRect:CGSizeMake(320, 480)
                                      inView:[[UIApplication sharedApplication] keyWindow]
                    permittedArrowDirections:0
                                    animated:YES];

【讨论】:

我尝试了您的解决方案,这对我也有用.. 没有错误。我能够在其他视图中显示弹出框。但在这种特殊情况下,我试图显示弹出框 no无论用户在应用程序中的什么位置。这就是我使用关键窗口和东西的原因。但无论我做什么,弹出窗口都不会出现在 iOS 8 中 我在生产代码中使用它,不知道为什么它不适合你,对不起! 看起来像是上述解决方案的组合,***.com/questions/24854802/… 为我提供了解决方案。感谢您的解决方案。【参考方案2】:

改变inView参数

[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

[testPopoverController presentPopoverFromRect:rect inView:"your current View Controller's view" permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

并确保它在调度块中

  dispatch_async(dispatch_get_main_queue(), ^

);

如果它在边界内,也可以改变你的矩形原点 n 大小值

【讨论】:

这正是我在您的帖子之前提出的建议,我对此表示反对... :( Smh。我只是想提供帮助,没有赞成票很好,但我认为反对票很苛刻试图帮助一个有效的解决方案。【参考方案3】:

尝试在此链接找到的解决方案:http://github.com/werner77/WEPopover

第一,让我们来做这段代码:

if ([viewController respondsToSelector:@selector(setPreferredContentSize:)]) 
    viewController.preferredContentSize = CGSizeMake(200, 300.0f);
 else 
    viewController.contentSizeForViewInPopover = CGSizeMake(200.0f, 300.0f);


self.popoverController = [[popoverClass alloc] initWithContentViewController:viewController];

if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) 
    [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]];


self.popoverController.delegate = self;

[self.popoverController presentPopoverFromRect:[sender bounds]
      inView:sender
      permittedArrowDirections:UIPopoverArrowDirectionUp
      animated:YES];

我希望这会有所帮助。它已经过测试并适用于 iOS6-iOS8。

PS。不要忘记查看viewDidLoad,并感谢 WEPopover 库。

【讨论】:

【参考方案4】:

我认为您必须在完整视图/视图控制器中而不是在 [UIApplication sharedApplication].keyWindow 中显示它

所以修改这段代码:

[testPopoverController presentPopoverFromRect:rect inView:[UIApplication sharedApplication].keyWindow permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

到:

[testPopoverController presentPopoverFromRect:rect inView:aViewControllerInYourApp permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

【讨论】:

因为您建议使用视图控制器,而不是视图? 是的,我看不出有什么问题。我认为这更像是一个设计模式问题??

以上是关于在 iOS8 中: UIPopoverController presentPopoverFromRect 不再适用于 keyWindow的主要内容,如果未能解决你的问题,请参考以下文章

推送通知未在 IOS8.1 中提供,但在少于 IOS8.1 时工作正常

Popover 演示在 iOS8 中不会使 tintColor 变暗

为啥你必须在 ios8 中删除观察者?

无法在 iOS8 中禁用报亭通知每日限制

在 Swift 中推送 iOS8 的通知状态

在 iOS8 中提示位置授权