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
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.
ho lo stesso problema ora, hai trovato una soluzione? –
no scusa ... ho trovato questo bug in molte app ...: o –