W moim przypadku rodzic UIViewController
zawiera UIPageViewController
który zawiera UINavigationController
który zawieraUIViewController
. Muszę dodać gest przesunięcia do ostatniego kontrolera widoku, ale przesunięcia są obsługiwane tak, jakby należały do kontrolera widoku strony. Próbowałem to zrobić zarówno programowo, jak i przez xib, ale bez rezultatu.
Więc jak rozumiem, nie mogę osiągnąć celu, dopóki nie poradzę UIPageViewController
sobie z jego gestami. Jak rozwiązać ten problem?
ios
uiviewcontroller
uigesturerecognizer
uipageviewcontroller
user2159978
źródło
źródło
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
maUINavigationController
. Klient chceOdpowiedzi:
Udokumentowanym sposobem zapobiegania
UIPageViewController
przewijaniu jest nieprzypisywaniedataSource
właściwości. Jeśli przypiszesz źródło danych, przejdzie ono do trybu nawigacji opartego na gestach, czemu próbujesz zapobiec.Bez źródła danych ręcznie udostępniasz kontrolery widoku, kiedy chcesz
setViewControllers:direction:animated:completion
metody, a na żądanie będą one przenoszone między kontrolerami widoku.Powyższe można wywnioskować z dokumentacji firmy Apple dotyczącej UIPageViewController (Omówienie, drugi akapit):
źródło
źródło
for (UIView *view in self.pageViewController.view.subviews) {
Tłumaczę odpowiedź user2159978 na Swift 5.1
źródło
Wdrażanie rozwiązania @ lee's (@ user2159978's) jako rozszerzenia:
Użycie: (w
UIPageViewController
)źródło
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Walczę z tym już od jakiegoś czasu i pomyślałem, że powinienem opublikować swoje rozwiązanie, kontynuując odpowiedź Jessedc; usuwanie źródła danych PageViewController.
Dodałem to do mojej klasy PgeViewController (połączonej z moim kontrolerem widoku strony w scenorysie, dziedziczy oba
UIPageViewController
iUIPageViewControllerDataSource
):Można to następnie wywołać, gdy pojawi się każdy widok podrzędny (w tym przypadku, aby go wyłączyć);
Mam nadzieję, że to komuś pomoże, nie jest tak czyste, jak bym chciał, ale nie wydaje się zbyt hacky itp.
EDYCJA: Jeśli ktoś chce przetłumaczyć to na Objective-C, zrób :)
źródło
Edytuj : ta odpowiedź działa tylko w przypadku stylu zawinięcia strony. Odpowiedź Jessedc jest znacznie lepsza: działa niezależnie od stylu i opiera się na udokumentowanym zachowaniu .
UIPageViewController
ujawnia swój zestaw aparatów do rozpoznawania gestów, których można użyć do ich wyłączenia:źródło
Jeśli chcesz
UIPageViewController
zachować możliwość przesuwania, jednocześnie zezwalając kontrolkom zawartości na korzystanie z ich funkcji (przesuń, aby usunąć itp.), Po prostu wyłączcanCancelContentTouches
wUIPageViewController
.Umieścić to w swoim
UIPageViewController
„sviewDidLoad
func. (Szybki)Plik
UIPageViewController
Ma automatycznie wygenerowane podrzędny, który obsługuje gesty. Możemy uniemożliwić tym podglądom anulowanie gestów treści.Z...
Przesuń, aby usunąć w tableView, który znajduje się w pageViewController
źródło
Przydatne rozszerzenie
UIPageViewController
do włączania i wyłączania machnięcia.źródło
Rozwiązałem to w ten sposób (Swift 4.1)
źródło
Szybki sposób na odpowiedź @lee
źródło
Podobnie jak @ user3568340 answer
Szybki 4
źródło
Dzięki odpowiedzi @ user2159978.
Sprawiam, że jest to trochę bardziej zrozumiałe.
źródło
Odpowiedzi, które znalazłem, wydają mi się bardzo zagmatwane lub niekompletne, więc oto kompletne i konfigurowalne rozwiązanie:
Krok 1:
Daj każdemu z elementów PVC odpowiedzialność za określenie, czy przewijanie w lewo i w prawo jest włączone, czy nie.
Każdy z kontrolerów widoku PVC powinien implementować powyższy protokół.
Krok 2:
W kontrolerach PVC wyłącz przewijanie, jeśli to konieczne:
Krok 3:
Dodaj efektywne metody blokady przewijania do swojego PVC:
Krok 4:
Zaktualizuj atrybuty związane z przewijaniem po przejściu do nowego ekranu (jeśli przejdziesz do jakiegoś ekranu ręcznie, nie zapomnij wywołać metody enableScroll):
źródło
Istnieje znacznie prostsze podejście, niż sugeruje większość odpowiedzi, które polega na zwróceniu
nil
w wywołaniach zwrotnychviewControllerBefore
iviewControllerAfter
źródła danych.Spowoduje to wyłączenie gestu przewijania na urządzeniach z systemem iOS 11+, przy jednoczesnym zachowaniu możliwości używania
dataSource
(np.presentationIndex
/presentationCount
Używany jako wskaźnik strony)Wyłącza również nawigację za pośrednictwem. the
pageControl
(kropki na dole)źródło
pageViewController.view.isUserInteractionEnabled = false
źródło
Tłumaczenie odpowiedzi @ user2159978 na C #:
źródło
(Swift 4) Możesz usunąć gestyRecognizers swojej stronyViewController:
Jeśli wolisz w przedłużeniu:
i
pageViewController.removeGestureRecognizers
źródło
Zadeklaruj to w ten sposób:
Następnie użyj tego w ten sposób:
źródło
Wyliczenie podglądów podrzędnych w celu znalezienia scrollView a
UIPageViewController
nie działa dla mnie, ponieważ nie mogę znaleźć żadnego scrollView w mojej podklasie kontrolera strony. Pomyślałem więc o wyłączeniu funkcji rozpoznawania gestów, ale na tyle ostrożnie, aby nie wyłączać niezbędnych.Więc wymyśliłem to:
Umieść to w środku
viewDidLoad()
i gotowe!źródło
Dodaj to do swojej klasy pageviewcontroller. 100% sprawne
źródło
po prostu dodaj tę właściwość kontrolną do swojej podklasy UIPageViewController :
źródło