iphone - color - Toque eventos dentro de ~ 8 píxeles de la barra de navegación no llamados
navigation bar ios swift 4 (4)
No creo que sea el problema, pero ¿trajiste las subvistas de botones al frente?
[self.view bringSubviewToFront:buttonView]
Tengo una aplicación con tres botones (en realidad UIView
) dispuestos horizontalmente debajo de la barra de navegación.
Los tres botones son de un tamaño lo suficientemente grande (más grande que el botón Atrás, por ejemplo), sin embargo, no responderán a los toques cuando el golpe se encuentre en la tercera parte superior, más o menos.
Soy consciente de que esta área directamente debajo de la barra de navegación está ''reservada'' para el botón Atrás y otros elementos de UINavegación que tienen un área táctil que se expande más allá de la barra de navegación (por un margen bastante significativo), sin embargo, en Incluso un elemento de navegación cercano para robar el evento, y mis puntos de vista aún no responden.
Lo extraño es que recibo una llamada al método hitTest
en mi UIView, pero nunca me tocó BeGo / Ended / etc.
El resultado es que es muy difícil presionar los botones y si uno está cerca de un UINavigationItem
, el elemento robará el evento, aunque en hitTest
estoy devolviendo el UIView
correcto al sistema.
Lamentablemente, soy el implementador y no el diseñador, por lo que un cambio de diseño es el último recurso.
¿Algunas ideas? ¡Gracias!
El código provisto por @Andrei causará incoherencia en la pila del controlador en iOS 7 cuando se aprietan rápidamente los controladores. El sistema cambiará la propiedad userInteractionEnabled
antes y después de las animaciones push / pop. Aquí es cómo resolví este problema.
@interface DMNavigationBar ()
@property (nonatomic, assign) BOOL changingUserInteraction;
@property (nonatomic, assign) BOOL userInteractionChangedBySystem;
@end
@implementation DMNavigationBar
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (self.userInteractionChangedBySystem && self.userInteractionEnabled == NO)
{
return [super hitTest:point withEvent:event];
}
if ([self pointInside:point withEvent:event])
{
self.changingUserInteraction = YES;
self.userInteractionEnabled = YES;
self.changingUserInteraction = NO;
}
else
{
self.changingUserInteraction = YES;
self.userInteractionEnabled = NO;
self.changingUserInteraction = NO;
}
return [super hitTest:point withEvent:event];
}
- (void)setUserInteractionEnabled:(BOOL)userInteractionEnabled
{
if (!self.changingUserInteraction)
{
self.userInteractionChangedBySystem = YES;
}
else
{
self.userInteractionChangedBySystem = NO;
}
[super setUserInteractionEnabled:userInteractionEnabled];
}
@end
Tenía el mismo problema y las respuestas anteriores son buenas y apuntan a una solución concisa.
La misma respuesta para la versión rápida:
class APLVNavigationBar: UINavigationBar {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
if pointInside(point, withEvent: event){
userInteractionEnabled = true
}else{
userInteractionEnabled = false
}
return super.hitTest(point, withEvent: event)
}
}
Tienes que subclasificar tu UINavigationBar y en tu CustomNavigationBar hacer esto:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
self.userInteractionEnabled = YES;
} else {
self.userInteractionEnabled = NO;
}
return [super hitTest:point withEvent:event];
}
Puede encontrar información sobre cómo subclase UINavigationBar aquí .