在iOS8上,从一个UIPopoverController转换到另一个UIPopoverController很慢

时间:2015-02-03 17:16:21

标签: ios ios8 uipopovercontroller uipopover

我的应用程序有多个按钮,每个按钮都会显示一个不同的UIPopoverController。我们有' passthroughViews'设置,以便在弹出窗口启动时仍然启用按钮。显示弹出窗口时按其中一个按钮会取消当前弹出窗口并显示新弹出窗口。麻烦的是,这在iOS8上似乎很慢。当我们从一个切换到另一个时,它们会出现并自行消失 - 当第一个关闭和下一个开始显示之间有一个暂停时。我正在调用这些dismissPopoverAnimated和presentPopoverFromRect:背靠背调用,所以两者之间没有任何关系。我已经尝试过设置动画'对于这两个都没有,但暂停仍然存在。非常感谢任何帮助。

4 个答案:

答案 0 :(得分:0)

当按下第二个按钮时,不是关闭弹出窗口,而是重新使用相同的弹出窗口。在屏幕上移动弹出窗口的位置并将新内容加载到其中。似乎这样会更快,并避免您遇到从一个模态视图切换到下一个模式视图的任何争用或延迟问题(我怀疑这是问题所在)。您将丢失消失/重新出现的动画,但它应该接近即时并提供良好的用户体验,因为用户实际上(从长远来看)并不想等待动画看到他们的内容无论如何都要推一个新按钮。

答案 1 :(得分:0)

这些街区里面有什么?如果它们与主线程上运行的东西绑定,那么您可能会将其视为滞后元素。您可能希望向上倾斜viewDidLoad和viewWillAppear方法。尝试在后台线程上运行较大的进程并在出现后更新它。

如果您正在使用核心数据存储,那么您可能正在使用主要上下文,它始终在主线程上运行。尝试提前缓存这些调用,或者在子线程上运行提取并在加载弹出框后将它们返回到主线程。

答案 2 :(得分:0)

试试这段代码,

[UIView transitionWithView:pop1.contentViewController.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{

    [pop1 dismissPopoverAnimated:NO];

} completion:^(BOOL finished) {

   [pop2 presentPopoverFromRect:btn.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:NO];

}];
希望它有所帮助。

答案 3 :(得分:0)

我有一个类似的问题让我的头脑在这个问题上敲了近一天:UIPopoverController有时出现的速度非常缓慢(有时它很迟钝,其他时间差不多,其他时间看起来像4英寸一样) ......),这只发生在iOs8上(iOs7总是眨眼),这让我相信我的解决方案也可能对你有帮助。

经过多次调试后,我得出的结论是,对我而言,问题与我在

中显示弹出窗口的事实有关。
- (NSIndexPath *) tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

方法(但我不排除存在其他类似情况)。

我的解决方案正在运行presentPopoverFromRect:方法(我的日志显示它是缓慢的方法)刚刚 willSelectRowAtIndexPath:方法结束后(事实上我把它塞满了整个popover“初始化并显示”在函数中也是为了延迟,为了安全起见,因为我的代码已经像那样了。)

这归结为运行UIPopoverController初始化并在像这样的块中显示代码:

dispatch_async(dispatch_get_main_queue(), ^() {
    // Do the popover stuff here
});

即使您没有使用表格,iOs8中也可能存在其他类似问题(因为 是一个Apple错误!),所以我想这可能值得一试......

希望它有所帮助, 干杯