在UIPageViewController中预加载下一页

时间:2013-02-26 17:24:38

标签: ios6 uipageviewcontroller uiswipegesturerecognizer

我看了很多很多地方,还没有找到一些好的示例代码,展示如何在UIPageViewController中预加载“下一页”。关于SO的一些答案详细说明了一些理论上的方法(参见this question),但还没有人发表一个有效的例子。

在我的应用程序的工作流程中,我每个屏幕显示1页,我想预先加载“下一个”屏幕,因为实际上,滑到下一页可能会非常慢,有时需要2次滑动(如果你滑动太快)以便渲染和显示下一页。这提供了糟糕的用户体验。我并不关心预加载“之前”或任何其他屏幕,因为典型的工作流程是用户在移动到下一个屏幕(右侧)之前停留在屏幕上一段时间。我正在使用幻灯片动画(不卷曲)。我以编程方式创建所有视图,并且根本不使用IB。

我试图将一些UIViewControllers存储在NSMutableArray中并从那里加载控制器,但是要正常工作并且似乎没有加速任何事情是很棘手的。必须有一个很好的方法来做到这一点。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

我已经在某种程度上解决了我的案子。对于每个mBound,我在ContentView内有一个UIImageView用于缩放。我的问题是,在启动应用程序时,如果用户在滑动之前进行了缩放,则在放大时转到下一页将不会工作得太好。我使用以下代码(Swift 1.2)来解决这个问题。正如我所说,但这有点像黑客。

UIScrollView

基本上,我在启动视图控制器之前和之后加载视图控制器。我这样做是通过将每个设置为VC来查看通过var layoutsubs = false override func viewDidLoad() { super.viewDidLoad() //Other code for implementing pageViewController omitted //add pageViewController to main view self.addChildViewController(pageViewController) self.view.addSubview(pageViewController.view) pageViewController.didMoveToParentViewController(self) //Load to the viewController after the starting VC, then go back to the starting VC var viewControllers = [afterVC] pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil) viewControllers = [startingVC] pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil) } override func viewWillLayoutSubviews() { //Load the viewController before the starting VC then go back to the starting VC //viewWillLayoutSubviews() is called multiple times, so do this only once if !layoutsubs { let startingVC = self.viewControllerAtIndex(imageIndex) as ContentViewController let beforeVC = pageViewController(pageViewController, viewControllerBeforeViewController: startingVC) as! ContentViewController var viewControllers = [beforeVC] pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Reverse, animated: true, completion: nil) viewControllers = [startingVC] pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil) layoutsubs = true } } see ref),然后返回到起始视图控制器。为什么这有两个不同的功能?好吧,如果你把它全部放在一个,启动VC旁边的两个视图控制器中只有一个会加载。在某些情况下这可能是合乎需要的,但我需要加载所有三个VC(之前,之后和之后)。

如果已加载setViewControllers(_:direction:animated:completion:),我不确定此方法的效果如何。例如,如果您需要在几次滑动之后将页面2加载到正在查看的页面之外。如果你把它放在UIPageViewController中,它可能会跳过。

答案 1 :(得分:0)

您应该使用例如仪器的时间分析器来调试您的代码。 这样做,您将找到哪个对象具有最长的运行时间。 也许它与UIPageViewController无关,而与页面内的视图无关。