我看了很多很多地方,还没有找到一些好的示例代码,展示如何在UIPageViewController中预加载“下一页”。关于SO的一些答案详细说明了一些理论上的方法(参见this question),但还没有人发表一个有效的例子。
在我的应用程序的工作流程中,我每个屏幕显示1页,我想预先加载“下一个”屏幕,因为实际上,滑到下一页可能会非常慢,有时需要2次滑动(如果你滑动太快)以便渲染和显示下一页。这提供了糟糕的用户体验。我并不关心预加载“之前”或任何其他屏幕,因为典型的工作流程是用户在移动到下一个屏幕(右侧)之前停留在屏幕上一段时间。我正在使用幻灯片动画(不卷曲)。我以编程方式创建所有视图,并且根本不使用IB。
我试图将一些UIViewControllers存储在NSMutableArray中并从那里加载控制器,但是要正常工作并且似乎没有加速任何事情是很棘手的。必须有一个很好的方法来做到这一点。
非常感谢任何帮助。
答案 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无关,而与页面内的视图无关。