que no desea especificar un botón como una costumbre titleView
porque eso significaría que ya no puedo usar el título estándar. Por otro lado, al agregar un reconocedor de gestos de toque a la barra de navegación, debemos asegurarnos de que no se active al tocar un botón de la barra.
Esta solución lleva a cabo tanto (para ser añadido a una subclase 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];
}
}
}
envía automáticamente un mensaje -titleViewTapped:
al controlador de vista (si se aplica).En una subclase UITableViewController
se podía poner en práctica el método como este para un desplazamiento a la función de la parte superior:
- (void)titleViewTapped:(id)sender {
[self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top) animated:YES];
}
Precaución: estamos recuperando el título de la vista mediante el indocumentado -valueForKey:@"titleView"
. ¡Técnicamente no usa una API privada, pero aún puede fallar en una futura versión de iOS!
Aunque está yendo en la dirección correcta, esto es bastante feo: la propiedad de fuente de UIButton está en desuso, e incluso con esa propiedad, el texto del título se ve muy diferente de lo normal. ¿Por qué molestarse con un botón? Una UIView clara funcionaría mejor. –
Nada malo con UILabel. Solo asegúrate de configurar el label.userInteractionEnabled = YES. De lo contrario, la etiqueta no reaccionará con los eventos táctiles. – JapCon