Rozwiązałem dla mojej sprawy trochę hackowania. Dla każdego ContentView
, mam UIImageView
w obrębie UIScrollView
dla powiększania. Mój problem polegał na tym, że po uruchomieniu aplikacji, jeśli użytkownik był powiększany przed przesuwaniem, przejście do następnej strony podczas powiększania nie działałoby zbyt dobrze. Używam następującego kodu (Swift 1.2), aby rozwiązać ten problem. Jak już powiedziałem, jest to trochę hack.
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
}
}
Przede wszystkim ładuję kontrolery widoku przed uruchomieniem kontrolera widoku i za nim. Robię to, ustawiając każdy z nich na VC, aby zobaczyć przez setViewControllers(_:direction:animated:completion:)
(see ref), a następnie powracając do kontrolera widoku początkowego. Dlaczego jest to w dwóch różnych funkcjach? Cóż, jeśli umieścisz wszystko w jednym, załaduje się tylko jeden z dwóch kontrolerów widoku obok początkowego VC. Może to być pożądane w niektórych przypadkach, ale potrzebowałem wszystkich trzech VC (przed, na początku i po) do załadowania.
Nie jestem pewien, jak dobrze ta metoda zadziała, jeśli UIPageViewController
był już załadowany. Na przykład, jeśli musisz wczytać stronę 2 z wyświetlanej strony, po kilku przeskokach. Może pominąć, jeśli umieścisz go w willTransitionToViewControllers()
.
Czy znalazłeś rozwiązanie problemu? Mam ten sam problem, zauważalne opóźnienie podczas przesuwania do następnego kontrolera widoku. – mattsson
Sortuj, ale odpowiedź jest bardzo specyficzna dla mojej implementacji. Ponieważ bardzo dużo pracowałem z UIPageViewController od opublikowania tego pytania, odkryłem, że jest to bardzo trudny temat. Zasadniczo moje problemy miały więcej wspólnego z wysyłaniem zapytań do DB, aby wyświetlić odpowiednie dane, co spowalniało każdą stronę. Byłem w stanie zoptymalizować zwroty stron poprzez wstępne obliczenie danych z bazy danych, a rysowanie widoków za pomocą funkcji automatycznego układu zamiast manipulowania ramkami - to bardzo pomogło. Po drugie miałem dużo obrazów do pokazania, więc zapisałem je w NSMutableArray bezpośrednio na "głównym" kontrolerze widoku (rodzic machnięcia). – DiscDev
Moje "rozwiązanie" zakończyło się tym, że ... czekam, aż Apple wyjdzie z szybszymi telefonami .... hahaha. Na iPhone'ach 6/6s nie ma już opóźnień.Zoptymalizowałem część kodu pobierania bazy danych, aby zdarzyło się raz, gdy najpierw utworzono kontroler stron i to bardzo pomogło, ale główna poprawa szybkości pochodzi od szybszych procesorów i większej ilości pamięci RAM, a także od zerwania obsługi iPhone'a 4/4s =) – DiscDev