手动滚动到包含许多子视图的页面时,UIPageViewController与UIPageViewControllerTransitionStyleScroll滞后

时间:2014-09-16 02:00:32

标签: ios objective-c uicollectionview uipageviewcontroller

我正在使用UIPageViewController在一系列页面上显示与日历相关的内容。对于月份和年份日历页面,我正在使用UICollectionViews,其单元格包含带日期编号的UILabel。年份页面在一年中的每一天使用UILabel,因此365个子视图。

我发现当我从其他页面手动滚动到Month页面时,性能是可以接受的,但滚动到Year页面,用户开始滚动到它之间存在很大的延迟(这是viewControllerBeforeViewController:调用),以及实际显示页面时。滚动时页面也不稳定,并且几乎没有其他页面(通常包含表格视图)那样响应。

我的问题是我无法为UIPageViewController提供一个用于缓存的顺序视图控制器数组,因为我经常需要以编程方式从一个页面跳转到另一个页面(这意味着我只是用一个视图设置UIPageViewController控制器在任何给定时间,使用此答案中的解决方案:https://stackoverflow.com/a/17330606/1370967)。因此,当用户手动滚动时,我依赖viewControllerBeforeViewController和viewControllerBeforeViewController来加载页面。 (如果我的理解在这里,请告诉我。)

所以,我想知道如何提高月份和年份页面的加载和滚动性能。

1 个答案:

答案 0 :(得分:1)

尝试打印UIPageViewController的内容视图的视图层次结构。当您通过viewControllerBeforeViewControllerviewControllerAfterViewController向视图控制器提供视图控制器时,它实际上将包含一个包含三页内容的滚动视图(一个用于前一个,一个用于下一个,一个用于当前页面)。

如果您的视图层次结构包含超过200个视图(并且根据您的描述,我认为您的子视图总数将在500-600左右),我强烈建议您以不同方式重新设计它。使用这样的树你将无法获得可接受的性能。

除了在页面之间滚动之外,如果您需要采用设备旋转,您也会遇到类似的问题。基本上在如此大量的子视图上进行布局是一项复杂的任务,需要时间。