Dans iOS 7, il y a le nouveau geste de glisser pour faire apparaître: vous faites glisser de gauche à droite sur le côté gauche de votre écran et le UINavigationController revient à l'ancien UIViewController .
Lorsque je crée un bouton de retour personnalisé comme celui-ci, les gestes de glisser-déplacer ne fonctionnent plus:
UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@selector(navigateBack)];
[customBackButton setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[customBackButton setBackButtonBackgroundImage:barBackBtnImgHighlighted forBarMetrics:UIBarMetricsDefault];
self.navigationItem.backBarButtonItem = customBackButton;
Comment puis-je utiliser un bouton de retour personnalisé et faire glisser le geste natif pour faire apparaître?
Mise à jour:
C'est ce qui se passe dans naviguerBack :
- (void)navigateBack {
[self.navigationController popViewControllerAnimated:YES];
}
Ajoutez simplement la ligne de code suivante:
[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];
Vous pouvez ajouter votre propre UIGestureRecognizer et faire apparaître le UIViewController vous-même. Voir docs pour plus d'informations.
Il n'est pas nécessaire d'ajouter votre propre reconnaissance de gestes. Le UINavigationController le fait déjà pour vous. Vous devez définir le délégué pour le interactivePopGestureRecognizer avant de l'activer.
Faites les deux choses suivantes:
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer setEnabled:YES];
J'utilise
[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]];
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
Pour éviter les plantages, vous devez faire attention à l'ajout et à la suppression de votre sélecteur arrière personnalisé. La raison en est que le contrôleur de navigation reste en place pendant que vous appuyez sur le contrôleur popping. Comme déjà indiqué après avoir ajouté votre bouton de retour personnalisé + sélecteur, vous devez effectuer les opérations suivantes dans viewDidApear.
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)];
}
Puis en vue
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
[self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)];
}
Le timing de ces appels est une clé. Sinon, vous pouvez tomber en panne, voir plus de détails sur la raison dans ici
Il y a un nouveau reconnaisseur de gestes UIScreenEdgePanGestureRecognizer
. Vous pouvez l'ajouter à votre vue et gérer respectivement (appelez navigateBack
), répliquant le comportement de navigation des contrôleurs de vue.
Qu'avez-vous fait dans "naviguerBack"?
Utilisez cette méthode comme ceci:
- (void)navigateBack
{
[self.navigationController popViewControllerAnimated:YES];
}
essayez d'ajouter ceci dans le bouton de retour personnalisé self.navigationController.interactivePopGestureRecognizer.delegate = (id) self;