iphone - custom - UINavigationBar UIBarButtonItems mucho más grande área de clic que requerida
uibarbuttonitem image swift (8)
con suerte, alguien puede ayudarme a salir de la red en busca de la respuesta y no puedo encontrar una-
los UIBarButtonItems añadidos a UINavigationBar tienen un área de clic mucho mayor que la requerida; por ejemplo, abra cualquier proyecto que tenga una barra de navegación con botones al hacer clic en cualquier lugar entre el final del botón y el título de la barra de navegación; el botón hace clic, cuando claramente no hizo clic en el botón-
también intente esto: haga clic debajo de la barra de navegación, debajo del botón, el botón hace clic alrededor de 5+ píxeles debajo de la barra de navegación-
mi problema es esto-
He agregado un encabezado personalizado con botones a una vista de tabla, pero cuando hago clic en los botones en el encabezado, los botones UINavigationBar activan esos 5+ píxeles en lugar de los botones en el encabezado de la vista de tabla.
Hice una prueba y eliminé los botones de UINavigationBar y lo interesante es que para los 5 píxeles debajo de la barra de navegación, los botones en el encabezado no se dispararán aunque no haya botones en la barra de navegación.
es casi como si la barra de navegación hubiera reservado unos 5+ píxeles debajo de sí mismo como espacio de clic-
mi pregunta es esta-
¿Puede alguien decirme cómo hacer que la barra de navegación no tome esos 5+ píxeles adicionales para sus botones?
muchas gracias ;)
Esta es la única solución que encontré. Crea un contenedor del botón personalizado:
//Create a container for the button
UIView *buttonContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 55, 44)];
//Create a smaller button
UIButton *closeButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 55, 25)];
[closeButton setTitle:@"Cancel" forState:UIControlStateNormal];
//center the title
closeButton.titleEdgeInsets = UIEdgeInsetsMake(23, 0, 0, 0);
[buttonContainer addSubview:closeButton];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:buttonContainer];
Esto se puede hacer directamente desde un guión gráfico. Arrastre un UIView en cada elemento de navegación, establezca su fondo en clearColor y califíquelo. Arrastre un botón en cada UIView y métalos para que coincidan.
La respuesta corta es ... no debería intentar y deshacerse de ellos. Se trata de facilidad de uso. La barra de navegación en la parte superior tiende a significar que la gente toca más bajo de lo que cabría esperar. Siempre deje ese espacio allí, o tenga un área de impacto lo suficientemente grande como para que el usuario apuñale su dedo hacia el medio de su elemento "debajo de la barra de navegación" evite el área muerta.
No estoy 100% seguro, pero tal vez puedas obtener la ubicación del toque a través de la clase UITouch.
¡UIBarButtonItem no extiende UIResponder, pero UINavigationBar sí!
Entonces, si subclase UINavigationBar y utiliza esta subclase en su aplicación, tal vez pueda capturar las coordenadas del toque y verificar si están bien para usted y luego decidir aplicar la acción de la barra de navegación o su botón (mediante una redirección personalizada) .
Por lo que yo sé, es imposible apagarlo. Si tiene otros botones en la barra de navegación, esos espacios de clic no colisionarán, pero si tiene un botón directamente debajo de la barra de navegación sin espacio entre ellos, no tendrá suerte. Considere un pequeño relleno en el encabezado y sus botones como una solución.
Tratar de evitar el relleno de la barra de navegación de la UIN puede ocasionarle problemas cuando se envía a la tienda de aplicaciones. Sería más fácil agregar el relleno a su encabezado personalizado. Como un "engorro" he aprendido a apreciar el HIG.
Una pregunta muy antigua, pero tal vez una solución sea útil para otros también ...
Creé una subclase UINavigationBar , que anula solo un método: '' hitTest: withEvent: ''. Cuando se invoca HitTest: withEvent , comprueba si el evento se ha producido dentro del marco de la barra de navegación (pointInside: withEvent :) o no. En caso de que el evento haya ocurrido afuera, el indicador userInteractionEnabled se establece en NO, por lo que la barra de navegación y sus subvistas ignorarán el evento.
En mi caso, la subclase de la barra de navegación se inserta a través de IB, pero por supuesto también es posible insertarla a través de ''UINavigationController initWithNavigationBarClass: toolbarClass:''
Encabezamiento:
@interface MMMasterNavigationBar : UINavigationBar
@end
Implementación:
@implementation MMMasterNavigationBar
/*
hitTest:withEvent:
The hit area in for navigation bar button items is enlarged by default.
Other objects directly below the navigation bar doesn''t receive tap events.
We avoid the default enlarging of the tappable area by disabling userInteraction
when the real tap is outside the navigation bar.
*/
-(UIView *)hitTest:(CGPoint)pPoint
withEvent:(UIEvent *)pEvent {
//FLog;
if ([self pointInside:pPoint
withEvent:pEvent]) {
//NSLog(@"User interaction enabled");
self.userInteractionEnabled = YES;
} else {
//NSLog(@"User interaction disabled");
self.userInteractionEnabled = NO;
}
return [super hitTest:pPoint
withEvent:pEvent];
}
@end
var buttonContainer:UIView = UIView()
buttonContainer.frame = CGRectMake(0, 0, 32, 32)
var imagess:UIImage = UIImage(named: "[email protected]")!
var closeButton:UIButton = UIButton()
closeButton.setImage(imagess, forState: UIControlState.Normal)
closeButton.frame = CGRectMake(10, 5, 20, 20)
closeButton.contentMode = UIViewContentMode.Center
closeButton.titleEdgeInsets = UIEdgeInsetsMake(20, 0, 0, 0)
buttonContainer.addSubview(closeButton)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: buttonContainer)