Ho risolto per il mio caso in un po 'di hack. Per ogni ContentView
, ho unoall'interno di uno UIScrollView
per lo zoom. Il mio problema era che all'avvio dell'applicazione, se l'utente eseguiva lo zoom prima di eseguire lo scorrimento, passare alla pagina successiva mentre lo zoom non funzionava troppo bene. Io uso il seguente codice (Swift 1.2) per risolvere questo problema. Come ho già detto, è un po 'un trucco.
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
}
}
Essenzialmente, si carica il controller di vista prima e dopo il controller della vista di partenza. Lo faccio impostando ciascuno sul VC per vedere tramite setViewControllers(_:direction:animated:completion:)
(see ref), quindi tornando al controller della vista iniziale. Perché questo è in due diverse funzioni? Bene, se lo metti tutto in uno, verrà caricato solo uno dei due controller di visualizzazione accanto al VC iniziale. Questo potrebbe essere desiderabile in alcuni casi, ma avevo bisogno di caricare tutti e tre i VC (prima, dopo e dopo).
Non sono sicuro di quanto questo metodo possa funzionare se lo UIPageViewController
è già stato caricato. Ad esempio, se è necessario caricare la pagina 2 lontano dalla pagina visualizzata, dopo alcuni passaggi. Potrebbe saltare se lo inserisci in willTransitionToViewControllers()
.
fonte
2015-07-30 09:27:23
Hai trovato una soluzione per questo? Ho lo stesso problema, ottenendo un ritardo notevole quando si passa al successivo controller della vista. – mattsson
Sort of, ma la risposta è molto specifica per la mia implementazione. Poiché ho lavorato molto con UIPageViewController da quando ho postato questa domanda, ho scoperto che è un argomento molto delicato. Fondamentalmente, i miei problemi avevano più a che fare con l'interrogazione del DB per i dati giusti da mostrare, il che rallentava ogni pagina. Sono stato in grado di ottimizzare i giri delle mie pagine pre-calcolando i dati dal DB e disegnando le mie viste usando Auto Layout invece di scherzare con i frame - questo ha aiutato molto. In secondo luogo avevo molte immagini da mostrare, quindi le ho archiviate in un NSMutableArray direttamente sul controller di visualizzazione "principale" (padre di scorrimento). – DiscDev
La mia "soluzione" ha finito per essere ... continua ad aspettare che Apple esca con i telefoni più veloci .... hahaha. Su iPhone 6/6s, non c'è più lag.Ho ottimizzato parte del codice di recupero del database da eseguire una volta quando il controller di pagina è stato creato e questo ha aiutato molto, ma i miglioramenti principali della velocità sono derivati da processori più veloci e più RAM e il supporto di phasing out per iPhone 4/4s =) – DiscDev