2010-10-12 15 views
5

En la siguiente captura de pantalla, si hago clic en "v" desde "Kioscos disponibles", se inicia la acción del botón Atrás ... (no con la segunda "a").UINavigationItem Botón Atrás área táctil demasiado grande

alt text

No entiendo por qué, no tengo nada especial en mi código (este es el valor predeterminado BackButton manejado por el controlador de navegación). También tengo el mismo error con otra aplicación que hice, pero nunca lo noté en otras aplicaciones.

¿Alguna idea?

Gracias.

+0

tengo el mismo problema ahora, ¿encontró una solución? –

+0

, no, lo siento ... Encontré ese error en muchas aplicaciones ...: o –

Respuesta

8

Eso no es un error, hace lo mismo en las aplicaciones de Apple, e incluso en algunos (¿muchos/todos?) Botones. Es el comportamiento de los eventos táctiles en los botones: el área del toque es más grande que los límites del botón.

1

Necesitaba hacer lo mismo y terminé volcando el método UINavigationBar touchesBegan: withEvent y comprobando la coordenada y del toque antes de llamar al método original.
Esto significa que cuando el toque estaba demasiado cerca de un botón que estaba usando debajo de la Navegación, podría cancelarlo.

Ex: El botón de retroceso casi siempre capturado el evento táctil en lugar de la "Primera" Botón enter image description here

Aquí está mi categoría:

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)sTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
float maxY = 0; 
for (UITouch *touch in touches) { 
    float touchY = [touch locationInView:self].y; 
    if ([touch locationInView:self].y > maxY) maxY = touchY; 
} 

NSLog(@"swizzlelichious bar touchY %f", maxY); 

if (maxY < 35) 
    [self sTouchesEnded:touches withEvent:event]; 
else 
    [self touchesCancelled:touches withEvent:event]; 
} 
- (void)sTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
float maxY = 0; 
for (UITouch *touch in touches) { 
    float touchY = [touch locationInView:self].y; 
    if ([touch locationInView:self].y > maxY) maxY = touchY; 
} 

NSLog(@"swizzlelichious bar touchY %f", maxY); 

if (maxY < 35) 
    [self sTouchesBegan:touches withEvent:event]; 
else 
    [self touchesCancelled:touches withEvent:event]; 
} 

La aplicación swizzle por Mike cenizas de CocoaDev

void Swizzle(Class c, SEL orig, SEL new) 
{ 
Method origMethod = class_getInstanceMethod(c, orig); 
Method newMethod = class_getInstanceMethod(c, new); 
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
    class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
else 
    method_exchangeImplementations(origMethod, newMethod); 
} 

Y la función llama a la función swizzle

Swizzle([UINavigationBar class], @selector(touchesEnded:withEvent:), @selector(sTouchesEnded:withEvent:)); 
Swizzle([UINavigationBar class], @selector(touchesBegan:withEvent:), @selector(sTouchesBegan:withEvent:)); 

No sé si Apple está de acuerdo con esto, podría estar infringiendo sus directrices de UI, intentaré actualizar la publicación si después de enviar la aplicación a la tienda de aplicaciones.

Cuestiones relacionadas