在 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 时工作正常