【问题标题】:UIScrollView performance with pagingUIScrollView 性能与分页
【发布时间】:2015-02-08 14:49:18
【问题描述】:

我正试图弄清楚如何提高我的UIScrollView 的性能。它是一个无限滚动的分页滚动视图。在scrollViewDidEndDecelerating 中,页面在当前控制器的前面和后面两个加载。我的问题是页面是非常复杂的视图控制器。分页动画完成后,大约需要 1-2 秒才能再次分页。这取决于设备(iPad Mini 比配备 Retina 的 iPad Mini 差 2-3 倍)。

关于如何解决此问题的任何想法?我相信问题是在scrollViewDidEndDecelerating 中加载视图。

这是我在scrollViewDidEndDecelerating中调用的代码:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyPageViewController *page = [storyboard instantiateViewControllerWithIdentifier:@"PageVC"];
[self.scrollView addSubview:page.view];

【问题讨论】:

  • 没有代码很难帮你。但是你需要记住,如果你在你的 scrollViewDidEndDecelerating 中加载视图控制器(在主线程中),无论你提前加载多少,你总是会等待下一个(最后一个,新的)。跨度>
  • 没错。我很想展示代码,但这是一个跨越多个类的非常复杂的设置。我想我需要一种在滚动视图委托方法之外创建视图控制器的方法。我尝试使用NSNotificationCenter,但当然这是同步的。我也尝试在后台做一些工作,但这也无济于事。
  • 为什么不使用 UIPageViewController?它会自动制作这个东西。
  • 不幸的是,这不可能。我在分页期间做了一个复杂的自定义交互式动画。我尝试了几种解决方案(UIPageViewController、带有自定义转换的 UINavigationController),但这是唯一让我接近完美的方法。唯一的问题是在您可以滑动到下一页之前会有这么小的延迟。
  • 这并不难,它会很好地工作,将你所有的项目嵌入到 CollectionView 中,你将有一个 collectionView 作为主要,每个单元格都是整个屏幕(你把 pagingEnabled = YES) .在每个单元格中放置一个完整的 viewController。

标签: ios objective-c ipad uiscrollview


【解决方案1】:
  1. 滚动视图及其子类在处理不透明度方面确实很糟糕。如果有纯色背景,尽可能避免使用不透明背景的子视图。它可能会对滚动性能产生巨大影响
  2. 确保在后台加载后续页面的数据
  3. 重用视图和视图控制器。当您可以在现有视图控制器上更新模型时,无需实例化新视图控制器。创建一个包含几个 (3-5) 页面的池并移动它们,就像 UITableView 所做的那样
  4. 您始终可以运行 Profiler 来查找瓶颈

但无论如何,我敢打赌你只是阻塞了主线程(负责更新 UI)来获取数据并加载新的视图控制器

【讨论】:

  • 关于 #1 - 我应该在 UIScrollView 的所有子视图上打开“不透明”吗?
  • @kmcgrady 不,我的意思是,如果视图具有纯色背景色,则其子视图也应尽可能具有纯色背景,而不是 clearColor。仅在绝对需要时才使用不透明背景
  • 啊,好的。感谢您的提示。我现在正在处理它们(尤其是#3)。
  • 回收产生了很大的不同。我基本上在我的 VC 上创建了一个“回收”方法,它是我的 viewDidLoad 的副本。然后我开始删除不需要再次运行的代码,并尽可能将其移至后台。这是一个随着每次更改逐渐将性能提高 0.05 秒的过程 :) 还有一些工作要做,但几乎完成了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多