Pas de Glisser en Arrière lorsque le masquage de la Barre de Navigation dans UINavigationController
J'aime le mouvement de balayage pack c'est héritée de l'incorporation de votre point de vue dans un UINavigationController. Malheureusement, je n'arrive pas à trouver un moyen de masquer la barre de navigation, mais encore la touche pan glissez geste. Je peux écrire personnalisé gestes, mais je préfère ne pas et à s'appuyer sur les UINavigationController arrière geste de balayage à la place.
si je décochez la case dans la table de montage séquentiel, le retour de balayage ne fonctionne pas
sinon si I du programme, le cacher, le même scénario.
- (void)viewDidLoad
{
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:YES animated:NO]; //and animated:YES
}
Il n'y a pas moyen de cacher la barre de Navigation supérieure et ont encore le mouvement de balayage?
- Est l'ajout d'un UIGestureRecognizer acceptable? C'est un jeu d'enfant à mettre en œuvre.
- j'essayais d'éviter que depuis il l'habitude de fonctionner aussi bien que la UINavigationController de retour de balayage. Je cherche dans UIScreenEdgePanGestureRecognizer puisque certains disent qu'il permet, mais nai pas eu à le faire fonctionner encore. La recherche de la plus simple et la plus élégante solution ici.
InformationsquelleAutor mihai | 2014-07-12
Vous devez vous connecter pour publier un commentaire.
Un hack qui fonctionne est de définir la
interactivePopGestureRecognizer
de déléguée de laUINavigationController
ànil
comme ceci:Mais dans certaines situations, il pourrait créer d'étranges effets.
gestureRecognizerShouldBegin
, de retourtrue
si lenavigationController
'sviewController
nombre est supérieur à 0.viewWillDisappear
et jusqu'à présent, n'ont pas connu indésirables effets secondaires.Des problèmes avec d'Autres Méthodes
Réglage de la
interactivePopGestureRecognizer.delegate = nil
a des effets secondaires indésirables.Réglage
navigationController?.navigationBar.hidden = true
fonctionne, mais ne laissez pas votre changement dans la barre de navigation pour être caché.Enfin, il est généralement préférable de créer un modèle objet qui est le
UIGestureRecognizerDelegate
pour votre manette de navigation. Réglage d'un contrôleur dans leUINavigationController
pile est ce qui est à l'origine de laEXC_BAD_ACCESS
erreurs.Solution Complète
Tout d'abord, ajoutez cette classe à votre projet:
Ensuite, définissez votre manette de navigation du
interactivePopGestureRecognizer.delegate
à une instance de votre nouveauInteractivePopRecognizer
classe.Profiter d'une cachée de la barre de navigation, sans effets secondaires, qui fonctionne même si votre télécommande a table, la collection ou le défilement de l'affichage des sous-vues.
Dans mon cas, afin d'éviter des effets bizarres
Vue de la racine contrôleur
http://www.gampood.com/pop-viewcontroller-with-out-navigation-bar/
EXEC_BAD_ACCESS
UIGestureRecognizerDelegate
à la racine de la vue-contrôleur... Dans mon cas, le délégué a été fixé à néant dans un plus tard-vue-contrôleur de la vue racine contrôleur, de sorte que lorsque vous revenez à la vue de la racine de contrôleur,gestureRecognizerShouldBegin
n'était pas appelé. J'ai donc placé le.delegate = self
dansviewDidAppear()
. Qui a résolu les étranges effets dans mon cas.. Cheers!EXEC_BAD_ACCESS
qui se passe?EXC_BAD_ACCESS
erreur: stackoverflow.com/questions/28746123/...delegate
àviewWillAppear
et de néant auviewWillDisappear
. Semble de travailgestureRecognizerShouldBegin
et laisser revenir toujourstrue
, lors de l'impression de compter, juste pour confirmer que c'est la question - et cela n'arrive plus jamais! Donc, apparemment, tout simplement la mise en œuvre du logiciel de reconnaissance fixe, bien que je vais ajouter le comte de vérifier au cas où. Il peut être aussi que je n'ai pas testé assez longtemps.func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailByGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true //return NSStringFromClass(otherGestureRecognizer.dynamicType).containsString("UIScrollViewPanGestureRecognizer"); }
pour arrêter le défilement de la webview tout en faisant glisser en arrièrereturn navigationController!.viewControllers.count > 1
Vous pouvez sous-classe UINavigationController comme suit:
Mise en œuvre:
UIPageViewController
overscroll.(Mise À Jour) Swift 4.2
J'ai trouvé que les autres posté solutions de substitution de la délégué, ou la mise à néant causé un comportement inattendu.
Dans mon cas, quand j'étais sur le haut de la pile de navigation et essayé d'utiliser le geste à la pop, un de plus, il ne pourrait pas (comme prévu), mais les tentatives ultérieures de la pousser sur la pile pour commencer à causer bizarre bugs graphiques dans la barre de navigation. Cela fait sens, parce que le délégué est utilisé pour traiter plus que juste de savoir si ou de ne pas bloquer le geste d'être reconnu lorsque la barre de navigation est caché, et toutes les autres comportement a été jeté.
De mes tests, il semble que
gestureRecognizer(_:, shouldReceiveTouch:)
est la méthode que le délégué d'origine est mise en œuvre pour bloquer le geste d'être reconnu lorsque la barre de navigation est caché, nongestureRecognizerShouldBegin(_:)
. D'autres solutions que de mettre en œuvregestureRecognizerShouldBegin(_:)
dans leur travail de délégué à cause de l'absence de mise en œuvre degestureRecognizer(_:, shouldReceiveTouch:)
va provoquer le comportement par défaut de la réception de toutes les touches.@Nathan Perry solution est proche, mais sans mise en œuvre de
respondsToSelector(_:)
, le UIKit code qui envoie des messages à l'délégué crois qu'il n'est pas de mise en œuvre de l'une quelconque des délégués d'autres méthodes, etforwardingTargetForSelector(_:)
ne sera jamais appelé.Donc, nous prenons le contrôle de " gestureRecognizer(_:, shouldReceiveTouch:) dans l'un scénario spécifique, nous voulons modifier le comportement, et sinon avant tout le reste pour le délégué.
gestureRecognizerShouldBegin:
chose, et il "semble fonctionner". Vous demandez-vous aurais-je devriez regarder dehors pour.navigationController
était une référence forte dans la AlwaysPoppableDelegate. J'ai édité le code pour en faire unweak
de référence.Construction de Chasseur Maximillion du Moine répondre, j'ai fait une sous-classe pour UINavigationController et puis la classe personnalisée pour mon UINavigationController dans mon storyboard. Code Final pour les deux classes ressemble à ceci:
InteractivePopRecognizer:
HiddenNavBarNavigationController:
Storyboard:
Ressemble à la solution fournie par @ChrisVasseli est le meilleur. J'aimerais fournir la même solution en Objective-C, car la question est sur Objective-C (voir tags)
Vous pouvez le faire avec un Proxy Délégué. Lorsque vous êtes à la construction de la manette de navigation, prenez le délégué existant. Et la passer dans la procuration. Puis passer tous les délégué méthodes existantes délégué à l'exception
gestureRecognizer:shouldReceiveTouch:
à l'aide deforwardingTargetForSelector:
De l'installation:
Proxy Délégué:
Ma solution est d'étendre directement la
UINavigationController
classe :De cette façon, tous les contrôleurs de la navigation sera dismissable en le faisant glisser.
Xamarin Réponse:
Mettre en œuvre les
IUIGestureRecognizerDelegate
Interface dans votre ViewController de la définition de la Classe:Dans votre ViewController ajoutez la méthode suivante:
Dans votre ViewController de
ViewDidLoad()
ajouter la ligne suivante :UINavigationController
's vue de la racine de contrôleur? Je reçois leEXEC_BAD_ACCESS
quand j'ai essayer cette.gestureRecognizerShouldBegin:
.J'ai essayé et ça fonctionne parfaitement :
Comment masquer la Barre de Navigation sans perdre de retomber capacité
L'idée est de mettre en œuvre "UIGestureRecognizerDelegate" dans votre .h
et d'ajouter ceci à votre .m fichier.
Voici ma solution:
Je suis l'évolution alpha sur la barre de navigation, mais la barre de navigation n'est pas caché.
Tous mon point de vue, les contrôleurs sont une sous-classe de mon BaseViewController, et là, j'ai:
Vous pouvez également sous-classe UINavigationController et de mettre cette méthode là.
Simple, aucun effet secondaire Répondre
Alors que la plupart des réponses sont bonnes ici, ils ont apparemment des effets secondaires indésirables (application de rupture) ou sont prolixes.
Les plus simples et fonctionnelles de la solution qui me vient en tête est la suivante:
Dans le ViewController que vous cachez la navigationBar,
D'autres réponses ont suggéré que mettre le délégué à néant. Effectuez un balayage vers l'arrière à la vue initiale du contrôleur sur la pile de navigation des résultats dans tous les gestes d'être désactivé. Une sorte de surveillance, peut-être, de la UIKit/UIGesture devs.
Ainsi, certains ici les réponses que j'ai mis en œuvre a abouti à la non-apple standard de navigation comportement (notamment la possibilité de faire défiler vers le haut ou vers le bas tout en glissant vers l'arrière). Ces réponses semblent également un peu verbeux et, dans certains cas, incomplet.
Certaines personnes ont eu du succès en appelant le
setNavigationBarHidden
méthode d'animation avecYES
à la place.De mon point de vue contrôleur sans navigationbar-je utiliser
Cours interactif de licenciement le bouton précédent permet de briller à travers, ce qui est pourquoi je l'ai caché.
Il y a vraiment une solution simple que j'ai testé et fonctionne parfaitement, c'est dans Xamarin.iOS, mais peut être appliquée à natif de trop:
Voici comment le désactiver de geste de reconnaissance lorsque l'utilisateur glisse hors du ViewController. Vous pouvez le coller sur votre viewWillAppear() ou sur votre ViewDidLoad() méthodes.