7

私は非常に多くの場所を見てきましたが、UIPageViewController で「次の」ページをプリロードする方法を示す良いサンプル コードをまだ見つけていません。それを行うためのいくつかの理論的な方法を詳述するSOに関するいくつかの回答があります(この質問を参照してください)が、まだ実用的な例を投稿している人はいません。

私のアプリのワークフローでは、画面ごとに 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
    }
}

基本的に、View Controller の開始前後に View Controller をロードします。これを行うには、それぞれを VC に設定して参照しsetViewControllers(_:direction:animated:completion:)( ref を参照)、開始ビュー コントローラーに戻ります。なぜこれが2つの異なる機能にあるのですか? すべてを 1 つにまとめると、開始 VC の隣にある 2 つのビュー コントローラーのうちの 1 つだけが読み込まれます。これが望ましい場合もありますが、3 つの VC (前、開始、後) をすべてロードする必要がありました。

UIPageViewControllerがすでにロードされている場合、このメソッドがどの程度うまく機能するかはわかりません。たとえば、数回スワイプした後、表示されているページから 2 ページをロードする必要がある場合。に入れると飛び跳ねることがありwillTransitionToViewControllers()ます。

于 2015-07-30T09:27:23.753 に答える