7

我已经看了很多很多地方,但还没有找到一些好的示例代码来展示如何在 UIPageViewController 中预加载“下一个”页面。SO上有一些答案详细说明了一些理论方法(请参阅this question),但还没有人发布一个工作示例。

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

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

任何帮助是极大的赞赏。

4

1 回答 1

4

我已经通过一些技巧解决了我的情况。对于每个ContentView,我都有一个用于缩放的UIImageView内。UIScrollView我的问题是,在启动应用程序时,如果用户在滑动之前进行了缩放,那么在放大时转到下一页不会很好。我使用以下代码(Swift 1.2)来解决这个问题。正如我所说,这有点像黑客攻击。

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
    }
}

本质上,我在启动视图控制器之前和之后加载视图控制器。我通过将每个设置为 VC 以查看通过setViewControllers(_:direction:animated:completion:)请参阅 ref),然后返回到起始视图控制器来做到这一点。为什么这是两个不同的功能?好吧,如果你把它们合二为一,那么只有启动 VC 旁边的两个视图控制器中的一个会加载。这在某些情况下可能是可取的,但我需要加载所有三个 VC(之前、启动和之后)。

UIPageViewController如果已经加载,我不确定这种方法的效果如何。例如,如果您需要在几次滑动后将页面 2 加载到远离正在查看的页面的位置。如果你把它放进去,它可能会跳来跳去willTransitionToViewControllers()

于 2015-07-30T09:27:23.753 回答