2010-10-12 11 views
5

In questa schermata successiva, se si fa clic su "v" da "Kiosk disponibili", si avvia l'azione del pulsante Indietro ... (non con la seconda "a").UINavigationItem Pulsante Indietro area di tocco troppo grande

alt text

non capisco il motivo per cui, non ho niente di speciale nel mio codice (questa è l'impostazione predefinita BackButton gestito dal controller di navigazione). Ho anche lo stesso bug con un'altra applicazione che ho fatto, ma non ho mai notato questo su altre applicazioni.

Qualsiasi idea?

Grazie.

+0

ho lo stesso problema ora, hai trovato una soluzione? –

+0

no scusa ... ho trovato questo bug in molte app ...: o –

risposta

8

Questo non è un bug, fa lo stesso nelle app Apple e anche su alcuni (molti/tutti?) Pulsanti. È il comportamento degli eventi di tocco sui pulsanti: l'area del tocco è più grande dei limiti del pulsante.

1

Avevo bisogno di fare la stessa cosa e così ho finito con lo swizzling dei tocchi di UINavigationBarBegan: con il metodoEvent e il controllo della coordinata y del tocco prima di chiamare il metodo originale.
Ciò significa che quando il tocco era troppo vicino a un pulsante che stavo usando sotto la navigazione potrei cancellarlo.

Es: Il pulsante Indietro quasi sempre catturato l'evento di tocco al posto della "Prima" Pulsante enter image description here

Ecco la mia categoria:

@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]; 
} 

L'implementazione swizzle da Mike Ash da 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); 
} 

E la funzione chiama la funzione Swizzle

Non so se Apple stia bene, potrebbe infrangere le linee guida sull'UI, cercherò di aggiornare il post se dopo invio l'app all'app store.