【问题标题】:Transitioning from one UIPopoverController to another is slow on iOS8在 iOS8 上从一个 UIPopoverController 过渡到另一个很慢
【发布时间】:2015-02-03 17:16:21
【问题描述】:

我的应用程序有多个按钮,每个按钮都会调出不同的 UIPopoverController。我们设置了“passthroughViews”,因此在弹出窗口出现时按钮仍处于启用状态。在显示弹出框时按下其中一个按钮会关闭当前的弹出框并显示新的弹出框。问题是,这在 iOS8 上似乎很慢。弹出窗口出现并自行消失 - 只是当我们从一个切换到另一个时,在第一个关闭和下一个开始显示之间存在暂停。我将这些dismissPopoverAnimated 和presentPopoverFromRect: 称为背靠背调用,因此两者之间没有任何事情发生。我已经尝试将这两个的“动画”设置为 NO,但暂停仍然存在。非常感谢任何帮助。

【问题讨论】:

  • 能贴出相关代码吗?

标签: ios ios8 uipopovercontroller uipopover


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我们有很多弹出窗口都显示出这种缓慢。由于 iOS 7 上不存在性能问题,因此我不得不得出结论,这与我的应用程序代码无关。
    • 似乎在 iOS 8 Apple 中添加了 UIPopoverPresentationController 。多个弹出窗口可能存在性能问题。我会考虑重新设计应用程序以删除额外的弹出框。这不是真正正确的 UI 设计。
    【解决方案3】:

    试试这个代码,

    [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];
    
    }];
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      我遇到了一个类似的问题,让我头疼了将近一天:UIPopoverController 有时出现非常缓慢(有时很慢,有时几乎没问题,其他时间大约需要 4 英寸才能出现...),并且这只发生在 iOs8 上(iOs7 总是快速闪烁),这让我相信我的解决方案也可能对您有所帮助。

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

      中显示弹出框有关
      - (NSIndexPath *) tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
      

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

      我的解决方案是运行presentPopoverFromRect: 方法(我的日志显示它是慢速方法)就在willSelectRowAtIndexPath: 方法结束之后(事实上,我将整个弹出框“初始化”并在函数中显示”以延迟,为了安全起见,因为我的代码已经这样了)。

      这归结为运行 UIPopoverController 初始化并在如下块中显示代码:

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

      即使你不使用table,iOs8中也可能存在其他类似的问题(因为这一个Apple bug!),所以我想这可能值得一试......

      希望对你有帮助, 干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        相关资源
        最近更新 更多