Changement de bouton de retour dans iOS 7 désactive la navigation par balayage à l'arrière
J'ai un iOS 7 app où je suis réglage personnalisé de retour bouton comme ceci:
UIImage *backButtonImage = [UIImage imageNamed:@"back-button"];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setImage:backButtonImage forState:UIControlStateNormal];
backButton.frame = CGRectMake(0, 0, 20, 20);
[backButton addTarget:self
action:@selector(popViewController)
forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
viewController.navigationItem.leftBarButtonItem = backBarButtonItem;
Mais cela désactive l'iOS 7 "balayez vers la gauche vers la droite" geste pour naviguer vers le contrôleur précédent. Personne ne sait comment je peux créer un bouton personnalisé et de toujours garder ce geste est-il activé?
EDIT:
J'ai essayé de définir le viewController.navigationItem.backBarButtonItem à la place, mais cela ne semble pas montrer mon image personnalisée.
Je suis encore à trouver une solution pour cela?? EST-il quelqu'un qui a trouvé une bonne solution et d'expliquer pourquoi cela fonctionne??.
Comment sur l'utilisation des bien-faits de la troisième partie de la bibliothèque: SwipeBack?
Comment sur l'utilisation des bien-faits de la troisième partie de la bibliothèque: SwipeBack?
OriginalL'auteur lehn0058 | 2013-09-27
Vous devez vous connecter pour publier un commentaire.
IMPORTANT:
C'est un hack. Je recommande de prendre un coup d'oeil à ce réponse.
L'appel de la ligne suivante après l'affectation de l'
leftBarButtonItem
fonctionné pour moi:Edit:
Cela ne fonctionne pas si on l'appelle dans
init
méthodes. Il doit être appelé dansviewDidLoad
ou des méthodes similaires.Après le téléchargement de votre exemple de projet maintenant, je comprends votre problème. Le code fonctionne tant que l'affichage de la collection du contenu ne dépasse pas la largeur horizontale de l'affichage du contrôleur. Cependant, dès que l'affichage de la collection devient défilement horizontal il remplace le interactivePopGestureRecognizer. Je vais voir si je peux trouver un travail.
J'ai un problème avec ce code. Ça marche pas longtemps, au bout de 5-10 arrière-glisse VC se fige. Toute solution?
Timur Bernikowich je rencontre le même.Avez-vous trouver toutes les raisons pour cela?
Réglage de la délégué pour
self
unsets à partir d'un objet de la classe_UINavigationInteractiveTransition
. Il est de la responsabilité de l'objet pour s'assurer que la manette de navigation n'est pas dit de la pop alors qu'il est déjà en transition. Toujours en train d'enquêter pour savoir si ses possible d'activer ce geste ou pas lorsque le bouton de retour est la coutume.OriginalL'auteur Paul Hunter
Utiliser le backIndicatorImage et backIndicatorTransitionMaskImage propriétés de la UINavigationBar si possible. La définition de ces sur un UIAppearanceProxy pouvez facilement modifier le comportement de votre application. La ride est que vous ne pouvez définir que ceux sur ios 7, mais cela fonctionne parce que vous ne pouvez utiliser le menu geste sur ios 7 de toute façon. Normal de votre ios 6 style peut rester intact.
Essayer de manipuler les interactivePopGestureRecognizer délégué du conduire à beaucoup de problèmes.
topViewController
.Cela devrait en effet être acceptés réponse.
C'est une solution en supposant que tout ce que vous voulez faire est de changer le dos de l'image du bouton. Mais si vous voulez changer le bouton de retour de texte et/ou l'action effectuée lorsque vous cliquez sur le bouton de retour?
À ce stade, vous serait mieux servi par la mise en au UINavigationItem.leftBarButtonItem. Il existe une variété de réponses qui peuvent être trouvés par la recherche de leftBarButtonItem sur google ou sur stackoverflow.
Malheureusement, cela ne fonctionne pas sur iOS8. Le bouton retour ne permet pas de modifier son apparence à mon image personnalisée.
OriginalL'auteur Saltymule
J'ai vu cette solution http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/ qui les sous-classes UINavigationController. Son d'une meilleure solution, car il traite le cas où vous faites glisser avant que le contrôleur est en place - ce qui provoque une collision.
En outre, j'ai remarqué que si vous faites un glissement sur la racine de la vue-contrôleur (après avoir cliqué sur l'un, et le dos encore une fois, l'INTERFACE utilisateur ne répond plus. (aussi le même problème dans la réponse ci-dessus).
Donc le code dans la sous-classé UINavigationController devrait ressemble à:
Fonctionne parfaitement, merci!
LA MEILLEURE SOLUTION DANS L'ENSEMBLE DE LA PAGE. FONCTIONNE PARFAITEMENT BIEN. MERCI
C'est la bonne réponse!
OriginalL'auteur Nick H247
- Je utiliser
ce genre de bug?
Tout simplement la meilleure solution!
Solution la plus simple jamais.
yep, le meilleur. merci !
OriginalL'auteur Albert Chu
J'ai aussi masquer le bouton de retour, pour la remplacer par une coutume leftBarItem.
Retrait interactivePopGestureRecognizer délégué après l'action de poussée a fonctionné pour moi:
Merci de me le faire savoir! Pourriez-vous décrire le scénario exact? Je ne pouvais pas reproduire lors de glisser de la racine-vue-contrôleur
J'ai été paramètre dans la méthode viewDidLoad. Ma solution finale a été de définir une autre classe pour être le délégué, qui vient de se renvoie la valeur true pour "gestureRecognizerShouldBegin" si il y a plus d'un point de vue contrôleur de la valeur liquidative de la pile.
La grande solution, merci
MrNickBarker des raisons pour lesquelles il se fige, je suis en train de vivre la même
OriginalL'auteur avishic
C'est à partir de http://stuartkhall.com/posts/ios-7-development-tips-tricks-hacks, mais il provoque plusieurs bugs:
par exemple, Lorsque le rootViewController de navigationController montre, balayez à partir du bord gauche de l'écran, et appuyez sur quelque chose(RAPIDEMENT) pour pousser anotherViewController dans le navigationController, puis
De sorte que vous devez mettre en œuvre
UIGestureRecognizerDelegate
méthode dansself.navigationController.interactivePopGestureRecognizer.delegate
comme ceci:OriginalL'auteur iwill
Ici est swift3 version de Nick H247 réponse
OriginalL'auteur duan
Essayer
self.navigationController.
interactivePopGestureRecognizer
.enabled = YES;
avishic pourriez-vous svp répondre à expliquer pourquoi le délégué de travail?..Je suis coincé sur le même problème.
OriginalL'auteur ilya n.
Je n'ai pas l'écrire, mais le blog suivant a beaucoup aidé et résolu mes problèmes avec la coutume du bouton de navigation:
http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/
En résumé, il met en œuvre une coutume UINavigationController qui utilise le pop geste délégué. Très propre et portable!
Code:
Modifier. Ajouté correctif pour les problèmes lorsqu'un utilisateur essaie d'balayez vers la gauche sur une vue de la racine de contrôleur:
J'ai édité la réponse avec la solution que je pense que j'ai mis en œuvre pour résoudre ce problème. A un moment, mais il est logique. En gros, si la vue d'en haut est un contrôleur de la vue racine contrôleur, alors nous ne répondrons pas à la "interactivePopGestureRecognizer'
Il est de cacher mon bouton de retour
OriginalL'auteur kgaidis
RootView
ChildView
OriginalL'auteur PW486
Utiliser cette logique de garder activer ou de désactiver le geste de balayage..
OriginalL'auteur Muhammad Naeem Paracha
J'ai eu un problème similaire où j'ai été attribution de la vue actuelle contrôleur comme le délégué de l'interactif pop geste, mais de casser le geste sur tout point de vue poussé, ou des vues de dessous le point de vue de la valeur liquidative de la pile. La façon dont j'ai résolu ce problème a été de définir le délégué dans
-viewDidAppear
, puis le mettre à néant en-viewWillDisappear
. Qui a permis à mes autres points de vue à travailler correctement.OriginalL'auteur Bill Burgess
Imaginer que nous utilisons par défaut d'Apple maître/détail le modèle de projet, où le maître est une table view controller et en tapant sur il va montrer le détail de la vue-contrôleur.
Nous voulons personnaliser l'arrière bouton qui s'affiche dans la vue de détail du contrôleur. C'est la façon de personnaliser le image, la couleur de l'image, texte, la couleur du texte, et la police de la touche retour.
Pour modifier l'image, la couleur de l'image, la couleur du texte ou de la police à l'échelle mondiale, placer celui-ci dans un endroit qui est appelé avant tout de votre point de vue contrôleurs sont créés (par exemple
application:didFinishLaunchingWithOptions:
est un bon endroit).Note, vous pouvez utiliser
appearanceWhenContainedIn:
avoir plus de contrôle sur la vue des contrôleurs sont affectés par ces changements, mais gardez à l'esprit que vous ne pouvez pas passer[DetailViewController class]
, car elle est contenue à l'intérieur d'un UINavigationController, pas votre DetailViewController. Cela signifie que vous aurez besoin à la sous-classe UINavigationController si vous voulez plus de contrôle sur ce qui est touchée.Pour personnaliser le texte ou la police/couleur spécifique d'un bouton précédent article, vous devez le faire dans le MasterViewController (pas le DetailViewController!). Cela semble peu intuitive parce que le bouton s'affiche dans la DetailViewController. Cependant, une fois que vous comprenez que la façon de les personnaliser c'est par la définition d'une propriété sur un navigationItem, il commence à faire plus de sens.
Remarque: tentative de définition de l'titleTextAttributes après le réglage de l'auto.navigationItem.backBarButtonItem ne semble pas fonctionner, de sorte qu'ils doivent être définies avant d'attribuer la valeur de cette propriété.
OriginalL'auteur Senseful
Créer une classe 'TTNavigationViewController" qui est sous-classe de "UINavigationController' et faire de votre manette de navigation de cette classe, soit dans la table de montage séquentiel/classe, un Exemple de code dans la classe
OriginalL'auteur Prakash Raj