2010-10-12 13 views
5

Auf dem folgenden Screenshot, wenn ich auf "v" unter "Verfügbare Kiosks" klicke, wird die Aktion der Zurück-Schaltfläche gestartet ... (nicht mit dem zweiten "a").UINavigationItem Zurück Schaltflächenbereich zu groß

alt text

Ich verstehe nicht, warum, ich habe nichts Besonderes in meinem Code (dies ist die Standardbackbutton vom Navigationscontroller behandelt). Ich habe auch den gleichen Fehler mit einer anderen Anwendung, die ich getan habe, aber ich merke das nie auf anderen Anwendungen.

Irgendwelche Ideen?

Vielen Dank.

+0

Ich habe das gleiche Problem jetzt, haben Sie eine Lösung gefunden? –

+0

Nein sorry ... Ich habe diesen Fehler in vielen Apps gefunden ...: o –

Antwort

8

Das ist kein Fehler, es macht das gleiche in Apple-Apps und sogar auf einigen (viele/alle?) Tasten. Es ist das Verhalten von Berührungsereignissen auf Schaltflächen: Der Bereich der Berührung ist größer als die Schaltflächenbegrenzungen.

1

Ich musste das gleiche tun und so endete ich swizzling die UINavigationBar touchesBegan: withEvent Methode und Überprüfung der y-Koordinate der Berührung vor dem Aufruf der ursprünglichen Methode.
Dies bedeutet, dass, wenn die Berührung zu nahe an einer Taste war, die ich unter der Navigation verwendete, ich es abbrechen konnte.

Ex: Die Zurück-Taste fast immer das Berührungsereignis statt der "Ersten" Button ist gefangen enter image description here

Hier meine Kategorie:

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

Die swizzle Implementierung von Mike Ash von 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); 
} 

Und die Funktion ruft die Swizzle-Funktion

Ich weiß nicht, ob Apple damit einverstanden ist, es könnte verletzen ihre UI-Richtlinien, ich werde versuchen, den Beitrag zu aktualisieren, wenn ich die App an den App Store senden.