2016-10-02 2 views
4

Ich habe ein Problem, wo der erste Anruf zu touchesBegan:withEvent: auf einem UIView oder UIViewController verzögert wird, wenn Sie auf den linken Rand des Bildschirms berühren. Dies scheint ein neues Problem mit iOS 10 zu sein und tritt nur auf Geräten mit 3D Touch (iPhone 6s und neuer) auf. In der Tat, wenn Sie 3D Touch unter Allgemein-> Zugänglichkeit deaktivieren, verschwindet das Problem. Das Problem scheint nicht zu passieren, wenn Sie UIGestureRecognizers verwenden. Meine Problemumgehung ist im Moment, eine UIGestureRecognizer Unterklasse zu erstellen, die die touches* Methoden überschreibt und sie an meine alte Implementierung weiterleitet.`touchesBegan: withEvent:` ist am linken Rand des Bildschirms verzögert

Ist das nur ein Fehler oder gibt es eine Möglichkeit, die Verzögerung loszuwerden?

Antwort

5

versuchen, dies der Methode viewdidappear hinzuzufügen. Dies könnte das Problem beheben. es ist mir auch passiert, aber ich habe diesen Code vom Stack-Überlauf bekommen, der mein Problem behoben hat. hoffe es hilft dir auch

let window = view.window! 
let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer 
let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer 
gr0.delaysTouchesBegan = false 
gr1.delaysTouchesBegan = false 
+0

Hm ich sehe, wie dass die unmittelbare Problem lösen würde, aber mit den System Geste Erkenner Unordnung scheint, wie es mehr Probleme auf der ganzen Linie – Jayson

+0

verursachen werde ich einige mehr haben zu untersuchen und dies scheint die beste Lösung für den Moment. Diese Gestenerkenner sind Instanzen von '_UISystemGestureGateGestureRecognizer' und scheinen hauptsächlich verwendet zu werden, um sicherzustellen, dass Ihre App besser mit Systemgesten wie Control Center oder 3D Touch App Switching interagiert. Für den linken Rand glaube ich, dass die Verzögerung hinzugefügt wurde, um versehentliche App-Interaktionen zu verhindern, wenn der Benutzer versucht, Apps zu wechseln, aber in meinem Fall brauche ich reaktive Berührungen am linken Rand und es ist in Ordnung, wenn die Berührungen ausgelöst werden, wenn die Benutzer versuchen, zwischen Apps zu wechseln . – Jayson

1

Purteeek Lösung scheint auch in meinem Fall gut zu funktionieren. Das ist eine Ziel-C-Implementierung für SpriteKit:

- (void)didMoveToView:(SKView *)view { 

    UIGestureRecognizer* gr0 = view.window.gestureRecognizers[0]; 
    UIGestureRecognizer* gr1 = view.window.gestureRecognizers[1]; 

    gr0.delaysTouchesBegan = false; 
    gr1.delaysTouchesBegan = false; 

} 

Dies gilt nicht Chaos mit anderer Geste Erkenner und das System 3D-Touch noch funktioniert. Ich frage mich, warum das nicht das Standardverhalten ist.

+0

Dieser Patch funktioniert nicht mehr ... – alasker

0

Wie danialias arbeite ich an einem Spiel. Die Lösung, die ich gefunden habe (derzeit funktioniert, getestet auf einem iPhone mit 3D Touch aktiviert, wo dies ein echtes Problem bis jetzt war ..) funktioniert für beide Spiele/apps:

Es scheint, dass UITapGestureRecognizer nicht leidet diese Verzögerung, fügen Sie einfach einen hinzu und verwenden Sie ihn zum Behandeln von Taps.

In meinem Spiel, speichere ich berührt und mit ihnen umgehen zu jedem Intervall zu aktualisieren, so überwog ich

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

und da ich die UITouch Instanz gespeichert und zurück NO.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    [self.touches addObject:touch]; 
    return NO; 
} 
Verwandte Themen