Dans mon cas, le parent UIViewController
contient UIPageViewController
qui contient UINavigationController
qui contient UIViewController
. Je dois ajouter un geste de balayage au dernier contrôleur de vue, mais les balayages sont gérés comme s'ils appartenaient au contrôleur de vue de page. J'ai essayé de le faire à la fois par programme et via xib mais sans résultat.
Donc, si je comprends bien, je ne peux pas atteindre mon objectif tant que je n'ai pas UIPageViewController
géré ses gestes. Comment résoudre ce problème?
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
aUINavigationController
. Le client souhaite afficher le contrôleur de navigation lors du geste de balayage (si cela est possible), mais le contrôleur de vue de page gère les balayages à la placeRéponses:
La manière documentée d'empêcher le
UIPageViewController
défilement est de ne pas affecter ladataSource
propriété. Si vous attribuez la source de données, elle passera en mode de navigation `` gestuelle '', ce que vous essayez d'empêcher.Sans source de données, vous fournissez manuellement des contrôleurs de vue lorsque vous le souhaitez avec
setViewControllers:direction:animated:completion
méthode et il se déplacera entre les contrôleurs de vue à la demande.Ce qui précède peut être déduit de la documentation Apple de UIPageViewController (Présentation, deuxième paragraphe):
la source
la source
for (UIView *view in self.pageViewController.view.subviews) {
Je traduis la réponse de l' utilisateur2159978 en Swift 5.1
la source
Implémentation de la solution de @ lee (@ user2159978) en tant qu'extension:
Utilisation: (dans
UIPageViewController
)la source
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
Je me bats ça depuis un moment maintenant et j'ai pensé que je devrais publier ma solution, suite à la réponse de Jessedc; suppression de la source de données du PageViewController.
J'ai ajouté ceci à ma classe PgeViewController (lié à mon contrôleur de vue de page dans le storyboard, hérite à la fois
UIPageViewController
etUIPageViewControllerDataSource
):Cela peut alors être appelé lorsque chaque sous-vue apparaît (dans ce cas pour la désactiver);
J'espère que cela aide quelqu'un, ce n'est pas aussi propre que je le voudrais mais ne semble pas trop piraté, etc.
EDIT: Si quelqu'un veut traduire cela en Objective-C, veuillez le faire :)
la source
Modifier : cette réponse ne fonctionne que pour le style de page curl. La réponse de Jessedc est bien meilleure: fonctionne quel que soit le style et repose sur un comportement documenté .
UIPageViewController
expose son tableau de reconnaissance de gestes, que vous pouvez utiliser pour les désactiver:la source
Si vous souhaitez
UIPageViewController
conserver sa capacité à faire glisser, tout en permettant à vos contrôles de contenu d'utiliser leurs fonctionnalités (Glisser pour supprimer, etc.), désactivez simplementcanCancelContentTouches
leUIPageViewController
.Mettez dans votre
UIPageViewController
de »viewDidLoad
la fonct. (Rapide)Le
UIPageViewController
possède une sous-vue générée automatiquement qui gère les gestes. Nous pouvons empêcher ces sous-vues d'annuler les gestes de contenu.De...
Balayez pour supprimer sur une tableView qui se trouve à l'intérieur d'une pageViewController
la source
Une extension utile
UIPageViewController
pour activer et désactiver le balayage.la source
Je l'ai résolu comme ça (Swift 4.1)
la source
Un moyen rapide pour la réponse @lee
la source
Similaire à @ user3568340 answer
Swift 4
la source
Merci à la réponse de @ user2159978.
Je le rends un peu plus compréhensible.
la source
Les réponses que j'ai trouvées me semblent très déroutantes ou incomplètes, voici donc une solution complète et configurable:
Étape 1:
Donnez à chacun de vos éléments PVC la responsabilité de dire si le défilement gauche et droit est activé ou non.
Chacun de vos contrôleurs de vue PVC doit implémenter le protocole ci-dessus.
Étape 2:
Dans vos contrôleurs PVC, désactivez le défilement si nécessaire:
Étape 3:
Ajoutez les méthodes de verrouillage de défilement efficaces à votre PVC:
Étape 4:
Mettez à jour les attributs liés au défilement lorsque vous atteignez un nouvel écran (si vous passez manuellement à un écran, n'oubliez pas d'appeler la méthode enableScroll):
la source
Il existe une approche beaucoup plus simple que ce que la plupart des réponses suggèrent ici, qui consiste à revenir
nil
dans les rappelsviewControllerBefore
etviewControllerAfter
dataSource.Cela désactive le mouvement de défilement sur les appareils iOS 11+, tout en gardant la possibilité d'utiliser le
dataSource
(pour des choses telles que lepresentationIndex
/presentationCount
utilisé pour l'indicateur de page)Il désactive également la navigation via. le
pageControl
(les points en bas)la source
pageViewController.view.isUserInteractionEnabled = false
la source
Traduction de la réponse de @ user2159978 en C #:
la source
(Swift 4) Vous pouvez supprimer gestureRecognizers de votre pageViewController:
Si vous préférez en extension:
et
pageViewController.removeGestureRecognizers
la source
Déclarez-le comme ceci:
Ensuite, utilisez-le comme ceci:
la source
Énumérer les sous-vues pour trouver le scrollView d'un
UIPageViewController
n'a pas fonctionné pour moi, car je ne trouve aucun scrollView dans ma sous-classe de contrôleur de page. Donc, ce que j'ai pensé à faire est de désactiver les outils de reconnaissance de gestes, mais avec suffisamment de prudence pour ne pas désactiver les outils nécessaires.Alors je suis venu avec ceci:
Mettez cela à l'intérieur
viewDidLoad()
et vous êtes prêt!la source
Ajoutez ceci dans votre classe pageviewcontroller. 100% de travail
la source
ajoutez simplement cette propriété de contrôle à votre sous-classe UIPageViewController :
la source