Czy można programowo włączyć stronę UIPageViewController
?
ios
ios5
uikit
uipageviewcontroller
RAGOpoR
źródło
źródło
Odpowiedzi:
Tak, jest to możliwe metodą:
Jest to ta sama metoda, która jest używana do konfigurowania pierwszego kontrolera widoku na stronie. Podobnie, możesz go użyć, aby przejść do innych stron.
Zastanawiasz się, dlaczego
viewControllers
to tablica, a nie pojedynczy kontroler widoku?Dzieje się tak, ponieważ kontroler widoku strony może mieć „kręgosłup” (jak w iBookach), wyświetlający jednocześnie 2 strony treści. Jeśli wyświetlasz 1 stronę treści na raz, po prostu przekaż 1-elementową tablicę.
Przykład w Swift:
źródło
Ponieważ również tego potrzebowałem, omówię bardziej szczegółowo, jak to zrobić.
Uwaga: Zakładam, że użyłeś standardowego formularza szablonu do wygenerowania
UIPageViewController
struktury - który ma zarówno plik, jakmodelViewController
idataViewController
utworzony, gdy go wywołasz. Jeśli nie rozumiesz, co napisałem - wróć i utwórz nowy projekt, który używa rozszerzeniaUIPageViewController
będzie podstawą. Wtedy zrozumiesz.Dlatego przejście do konkretnej strony wymaga skonfigurowania różnych elementów metody wymienionej powyżej. W tym ćwiczeniu przyjmuję, że jest to widok poziomy z dwoma widokami. Zaimplementowałem to również jako IBAction, aby można było to zrobić za pomocą naciśnięcia przycisku lub czegokolwiek - równie łatwo jest wywołać selektor i przekazać potrzebne elementy.
Tak więc w tym przykładzie potrzebujesz dwóch kontrolerów widoku, które zostaną wyświetlone - i opcjonalnie, niezależnie od tego, czy idziesz do przodu w książce, czy do tyłu.
Zwróć uwagę, że po prostu zakodowałem na stałe, gdzie przejść do stron 4 i 5 i używam przesunięcia w przód. Stąd widać, że wszystko, co musisz zrobić, to przekazać zmienne, które pomogą ci zdobyć te przedmioty ...
źródło
Oto inny przykład kodu dla widoku pojedynczej strony. Implementacja dla viewControllerAtIndex została tutaj pominięta, powinna zwrócić prawidłowy kontroler widoku dla danego indeksu.
Strony można zmieniać, dzwoniąc
źródło
Mogę czegoś tutaj całkowicie brakować, ale to rozwiązanie wydaje się o wiele prostsze niż wiele innych proponowanych.
źródło
Ten kod dobrze mi działał, dzięki.
Oto, co z nim zrobiłem. Niektóre metody przechodzenia do przodu lub do tyłu i jedna do przechodzenia bezpośrednio do określonej strony. Jest to 6-stronicowy dokument w widoku pionowym. Będzie działać dobrze, jeśli wkleisz go do implementacji RootController szablonu pageViewController.
źródło
Swift 4:
Musiałem przejść do następnego kontrolera, gdy dotknę dalej kontrolera widoku kontrolera stron, a także zaktualizowałem indeks pageControl, więc było to dla mnie najlepsze i najprostsze rozwiązanie :
źródło
A co z używaniem metod z dataSource?
Analogicznie do tyłu.
źródło
W Swift :
źródło
Jednak użycie tego wywołania metody „self.pageViewController setViewControllers” nie powoduje wywołania „viewDidDissapear” w kontrolerze viewController dla strony, która została odrzucona, podczas gdy ręczne obrócenie strony powoduje wywołanie viewDidDissapear na odwróconej stronie. Myślę, że to jest przyczyną mojej katastrofy
„Liczba dostarczonych kontrolerów widoku (0) nie jest zgodna z liczbą wymaganą (1) dla żądanego przejścia”
źródło
Potrzebowałem również przycisku do nawigacji w lewo na kontrolerze PageViewController, który powinien robić dokładnie to, czego można oczekiwać od ruchu przeciągnięcia.
Ponieważ miałem już kilka reguł w " pageViewController: viewControllerBeforeViewController " do obsługi naturalnej nawigacji po przesunięciu, chciałem, aby przycisk ponownie wykorzystał cały ten kod i po prostu nie mogłem sobie pozwolić na użycie określonych indeksów aby dotrzeć do stron, jak poprzednio odpowiedzi tak. Musiałem więc wybrać alternatywne rozwiązanie.
Należy pamiętać, że poniższy kod dotyczy kontrolera widoku strony, który jest właściwością wewnątrz mojego niestandardowego kontrolera ViewController i ma kręgosłup ustawiony na środek.
Oto kod, który napisałem dla mojego przycisku Nawiguj w lewo:
Możesz zrobić coś bardzo podobnego, aby utworzyć właściwy przycisk nawigacyjny z tego miejsca.
źródło
W przypadku, gdy KONTROLA STRONY wskazująca bieżącą stronę jest O && Chcesz, aby strony nawigowały za pomocą funkcji przewijania, a także poprzez klikanie niestandardowych przycisków w Kontrolerze widoku strony, poniższe mogą być pomocne.
// Deleguj o nazwie viewControllerAfterViewController, gdy użytkownik przewinie do następnej strony
}
}
// Logika przycisków niestandardowych (Wstecz i dalej)
}
}
źródło
// teraz wywołaj tę metodę
[self moveToPage];
Mam nadzieję, że zadziała :)
źródło
W przypadku pojedynczej strony właśnie zredagowałem odpowiedź @Jack Humphries
źródło
Jak zauważył @samwize, sposób paginacji polega na użyciu
Oto sposób, w jaki to zrobiłem: moje źródło danych i delegat są oddzielne. Możesz wywołać tę metodę i zmienić tylko „następny” widok. Wcześniej musisz zastosować reguły stronicowania. Oznacza to, że musisz sprawdzić kierunek i następny kontroler. Jeśli użyjesz tej metody z niestandardowym źródłem danych, tablica kontrolerów, które wyświetlasz, nie ulegnie zmianie (ponieważ użyjesz niestandardowej tablicy w podklasie NSObject).
Korzystając z własnego źródła danych, metoda po prostu ustawia nowy widok (z określonym kierunkiem). Ponieważ nadal będziesz kontrolować strony, które będą wyświetlane podczas normalnego przesuwania.
źródło
Pracuję nad tym od wczoraj iw końcu to zadziałało. Nie mogłem całkowicie użyć standardowego szablonu, ponieważ mam trzy różne viewControllers jako childviews:
Potrzebowałem przycisku wyzwalacza tylko w pierwszym VC, więc dodałem jedną właściwość dla pageViewController i modelu:
Przepisałem metodę init modelu, aby przekazać storyboard i pageViewController jako parametry, więc mogłem ustawić je na mój VC1:
Na koniec dodałem IBAction w moim vc1, aby wyzwolić metodę pageViewController setViewControllers: direction: animated: Complete ::
Uwaga Nie muszę wyszukiwać indeksów VC, mój przycisk przenosi mnie do mojego drugiego VC, ale nie jest trudno uzyskać wszystkie indeksy i śledzić swoje widoki dzieci:
Mam nadzieję, że Ci to pomoże!
źródło
Oto rozwiązanie wykorzystujące metody UIPageViewControllerDataSource :
Kod śledzi bieżący wyświetlany kontroler widoku w UIPageViewController .
Najpierw zainicjuj currentViewController do początkowego kontrolera widoku ustawionego dla UIPageViewController .
Następnie śledzić currentViewController w UIPageViewControllerDelegate metod: pageViewController: willTransitionToViewControllers: a pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted: .
Na koniec, w sposobie wyboru (w poniższym przykładzie jest to - (IBAction) onNext: (ID) nadawcy ), można programowo przejść do następnego lub poprzedniego kontrolera używając UIPageViewControllerDataSouce metod pageViewController: viewControllerBeforeViewController: , pageViewController: viewControllerAfterViewController: aby uzyskać następny lub poprzedni kontroler widoku i przejdź do niego, wywołując [self.pageViewController setViewControllers: @ [vc] direction: UIPageViewControllerNavigationDirectionForward animowane: YES ukończenie: nil];
źródło
Ponieważ ViewControllers są osadzone w PageViewController, wszystko, co musisz zrobić, to:
Przykład w Xamarin, ale funkcjonalnie podobny do Swift itp. Poniższy kod byłby w delegacie Button Click w jednym z ViewControllers wyświetlanych jako strona:
źródło