In meinem Fall UIViewController
enthält Eltern UIPageViewController
welche UINavigationController
welche welche welche enthält UIViewController
. Ich muss dem letzten Ansichts-Controller eine Wischgeste hinzufügen, aber Wischen werden so behandelt, als ob sie zum Seitenansichts-Controller gehören. Ich habe versucht, dies sowohl programmgesteuert als auch über xib zu tun, aber ohne Ergebnis.
So wie ich es verstehe, kann ich mein Ziel erst erreichen, wenn ich UIPageViewController
mit seinen Gesten fertig bin . Wie kann man dieses Problem lösen?
ios
uiviewcontroller
uigesturerecognizer
uipageviewcontroller
user2159978
quelle
quelle
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
hatUINavigationController
. Der Kunde möchte den Navigationscontroller bei einer WischgesteAntworten:
Die dokumentierte Möglichkeit, das
UIPageViewController
Scrollen zu verhindern, besteht darin, diedataSource
Eigenschaft nicht zuzuweisen . Wenn Sie die Datenquelle zuweisen, wechselt sie in den "gestenbasierten" Navigationsmodus, den Sie verhindern möchten.Ohne Datenquelle stellen Sie View Controller manuell zur Verfügung, wenn Sie die
setViewControllers:direction:animated:completion
Methode verwenden möchten, und sie werden bei Bedarf zwischen View Controllern verschoben.Das Obige kann aus Apples Dokumentation von UIPageViewController (Übersicht, zweiter Absatz) abgeleitet werden:
quelle
quelle
for (UIView *view in self.pageViewController.view.subviews) {
Ich übersetze die Antwort von user2159978 in Swift 5.1
quelle
Implementierung der Lösung von @ lee (@ user2159978) als Erweiterung:
Verwendung: (in
UIPageViewController
)quelle
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Ich kämpfe jetzt schon eine Weile dagegen und dachte, ich sollte meine Lösung veröffentlichen, basierend auf Jessedcs Antwort; Entfernen der PageViewController-Datenquelle.
Ich habe dies meiner PgeViewController-Klasse hinzugefügt (verknüpft mit meinem Seitenaufruf-Controller im Storyboard, erbt beide
UIPageViewController
undUIPageViewControllerDataSource
):Dies kann dann aufgerufen werden, wenn jede Unteransicht angezeigt wird (in diesem Fall, um sie zu deaktivieren).
Ich hoffe, das hilft jemandem, es ist nicht so sauber, wie ich es gerne hätte, aber es fühlt sich nicht zu hackig an usw.
EDIT: Wenn jemand dies in Objective-C übersetzen möchte, bitte :)
quelle
Bearbeiten : Diese Antwort funktioniert nur für den Seitenrollstil. Jessedcs Antwort ist weitaus besser: Funktioniert unabhängig vom Stil und stützt sich auf dokumentiertes Verhalten .
UIPageViewController
macht eine Reihe von Gestenerkennern verfügbar, mit denen Sie sie deaktivieren können:quelle
Wenn Sie möchten, dass Sie
UIPageViewController
weiterhin wischen können, während Ihre Inhaltssteuerelemente ihre Funktionen verwenden können (Wischen zum Löschen usw.), schalten Sie einfachcanCancelContentTouches
in ausUIPageViewController
.Setzen Sie dies in Ihre Funktion
UIPageViewController
einviewDidLoad
. (Schnell)Das
UIPageViewController
hat eine automatisch generierte Unteransicht, die die Gesten verarbeitet. Wir können verhindern, dass diese Unteransichten Inhaltsgesten abbrechen.Von...
Wischen Sie zum Löschen in einer Tabellenansicht, die sich in einem pageViewController befindet
quelle
Eine nützliche Erweiterung
UIPageViewController
zum Aktivieren und Deaktivieren von Swipe.quelle
Ich habe es so gelöst (Swift 4.1)
quelle
Schneller Weg für @lee Antwort
quelle
Ähnlich wie bei @ user3568340 Antwort
Swift 4
quelle
Vielen Dank an die Antwort von @ user2159978.
Ich mache es etwas verständlicher.
quelle
Die Antworten, die ich gefunden habe, sehen für mich sehr verwirrend oder unvollständig aus. Hier ist eine vollständige und konfigurierbare Lösung:
Schritt 1:
Geben Sie jedem Ihrer PVC-Elemente die Verantwortung, festzustellen, ob das Scrollen nach links und rechts aktiviert ist oder nicht.
Jeder Ihrer PVC-Ansichtscontroller sollte das obige Protokoll implementieren.
Schritt 2:
Deaktivieren Sie in Ihren PVC-Controllern bei Bedarf den Bildlauf:
Schritt 3:
Fügen Sie Ihrem PVC die effektiven Scroll-Lock-Methoden hinzu:
Schritt 4:
Aktualisieren Sie die scrollbezogenen Attribute, wenn Sie einen neuen Bildschirm erreichen (wenn Sie manuell zu einem Bildschirm wechseln, vergessen Sie nicht, die enableScroll-Methode aufzurufen):
quelle
Es gibt eine viel einfachere Methode als die meisten Antworten hier vorschlagen, die Rückkehr ist
nil
in denviewControllerBefore
undviewControllerAfter
Datasource - Rückrufe.Dies deaktiviert die Bildlaufgeste auf iOS 11+ Geräten, während die Möglichkeit beibehalten wird, die
dataSource
(für Dinge wie diepresentationIndex
/presentationCount
für die Seitenanzeige verwendet) zu verwenden.Es deaktiviert auch die Navigation über. die
pageControl
(die Punkte unten)quelle
pageViewController.view.isUserInteractionEnabled = false
quelle
Übersetzen der Antwort von @ user2159978 auf C #:
quelle
(Swift 4) Sie können gestureRecognizers von Ihrem pageViewController entfernen:
Wenn Sie eine Erweiterung bevorzugen:
und
pageViewController.removeGestureRecognizers
quelle
Erklären Sie es so:
Dann benutze es so:
quelle
Das Auflisten der Unteransichten, um die Bildlaufansicht von zu finden,
UIPageViewController
hat bei mir nicht funktioniert, da ich in meiner Seitencontroller-Unterklasse keine Bildlaufansicht finden kann. Ich dachte also daran, die Gestenerkenner zu deaktivieren, aber vorsichtig genug, um die erforderlichen nicht zu deaktivieren.Also habe ich mir Folgendes ausgedacht:
Legen Sie das in die
viewDidLoad()
und Sie sind fertig!quelle
Fügen Sie dies in Ihre pageviewcontroller-Klasse ein. 100% arbeiten
quelle
Fügen Sie diese Steuereigenschaft einfach in Ihre UIPageViewController- Unterklasse ein:
quelle