ios6 uipageviewcontroller uiswipegesturerecognizer

ios6 - Precargar la siguiente página en UIPageViewController



uiswipegesturerecognizer (2)

Deberá depurar su código, utilizando, por ejemplo, el Time Profiler of Instruments. Al hacer eso, encontrará qué objeto tiene el mayor tiempo de ejecución. Tal vez no esté relacionado con UIPageViewController sino con la vista dentro de las páginas.

He buscado en muchos lugares y aún no he encontrado un buen código de muestra que muestre cómo precargar la página "siguiente" en un UIPageViewController. Hay algunas respuestas sobre SO que detallan algunas formas teóricas de hacerlo (vea esta pregunta ) pero nadie tiene que publicar un ejemplo de trabajo.

En el flujo de trabajo de mi aplicación, estoy mostrando 1 página por pantalla y quiero tener la "próxima" pantalla precargada porque, como está, deslizar hacia la página siguiente puede ser muy lenta, a veces requiere 2 deslizamientos (si desliza demasiado rápido ) para que se muestre y se muestre la página siguiente. Esto proporciona una mala experiencia de usuario. Realmente no me importa precargar las pantallas "previas" o de otro tipo, ya que el flujo de trabajo típico es que los usuarios permanezcan en la pantalla durante un tiempo antes de pasar a la siguiente pantalla (a la derecha). Estoy usando la animación de diapositivas (no acurrucarse). Creo todas las vistas programáticamente y no uso IB en absoluto.

Intenté almacenar algunos UIViewControllers en un NSMutableArray y cargar los controladores desde allí, pero es complicado trabajar correctamente y no parece acelerar nada. Debe haber una buena manera de hacer esto.

Cualquier ayuda es muy apreciada.


He resuelto para mi caso algo así como un hack. Para cada ContentView , tengo un UIImageView dentro de UIScrollView para ampliar. Mi problema era que al arrancar la aplicación, si el usuario ampliaba el zoom antes de deslizar, ir a la página siguiente mientras se ampliaba no funcionaría demasiado bien. Uso el siguiente código (Swift 1.2) para resolver este problema. Como he dicho, es un poco hackeo.

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

Básicamente, cargo los controladores de vista antes y después del controlador de vista inicial. Hago esto configurando cada una de ellas en el VC para verlas a través de setViewControllers(_:direction:animated:completion:) ( ver ref ), luego volviendo al controlador de vista inicial. ¿Por qué esto es en dos funciones diferentes? Bueno, si pones todo en uno, solo se cargará uno de los dos controladores de vista junto al VC inicial. Esto puede ser deseable para algunos casos, pero necesitaba los tres VCs (antes, inicio y después) para cargar.

No estoy seguro de qué tan bien funcionaría este método si el UIPageViewController ya estaba cargado. Por ejemplo, si necesita cargar la página 2 lejos de la página que se está viendo, después de algunos deslizamientos. Se puede omitir si lo coloca en willTransitionToViewControllers() .