Je ne voulais pas spécifier un bouton comme une coutume titleView
parce que cela signifierait que je ne peux plus utiliser le titre standard. D'un autre côté, lorsque vous ajoutez un outil de reconnaissance de gestes à la barre de navigation, nous devons nous assurer qu'il ne se déclenche pas lorsque vous tapez sur un bouton.
Cette solution réalise à la fois (à ajouter à une sous-classe UINavigationBar
):
- (void)awakeFromNib {
// put in -initWithFrame: if initialized manually
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ft_titleTapped:)];
[self addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
UIView *titleView = [self valueForKey:@"titleView"];
CGRect titleFrame = titleView.frame;
titleFrame.origin.y = 0; // expand to full height of navBar
titleFrame.size.height = self.frame.size.height;
return CGRectContainsPoint(titleFrame, [gestureRecognizer locationInView:self]);
}
- (void)ft_titleTapped:(UITapGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
// could add some checks here that the delegate is indeed a navigation controller
UIViewController<FTViewControllerAdditions> *viewController = (id)[((UINavigationController*)self.delegate) topViewController];
if ([viewController respondsToSelector:@selector(titleViewTapped:)]) {
[viewController titleViewTapped:self];
}
}
}
Il envoie automatiquement un message -titleViewTapped:
au contrôleur de vue (si elles sont appliquées).Dans une sous-classe UITableViewController
vous pouvez mettre en œuvre la méthode comme celui-ci pour un défilement à fonction supérieure:
- (void)titleViewTapped:(id)sender {
[self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top) animated:YES];
}
Attention: nous récupérons la vue du titre en utilisant la -valueForKey:@"titleView"
sans papier. Techniquement, il n'utilise pas une API privée, mais pourrait échouer dans une future version d'iOS!
Bien qu'il se dirige dans la bonne direction, c'est plutôt moche - la propriété de police de UIButton est obsolète, et même avec cette propriété, le texte du titre est très différent de la normale. Pourquoi s'embêter avec un bouton? Un UIView clair fonctionnerait mieux. –
Rien à reprocher à UILabel. Assurez-vous simplement, vous définissez le label.userInteractionEnabled = YES. Sinon, l'étiquette ne réagira pas aux événements tactiles. – JapCon