2016-10-12 4 views
7

Auf dem iPhone mit 3D-Touch-Funktion gibt es eine Funktion, bei der Sie durch langes Drücken auf die linke Seite des Bildschirms mit ausreichender Kraft wechseln können, welche App aktiv ist. Aus diesem Grund wird das Berührungsereignis für eine oder zwei Sekunden verzögert, wenn auf der linken Seite des Bildschirms eine nicht bewegte Berührung auftritt, bis das iPhone überprüft, dass der Benutzer nicht versucht, zwischen Aufgaben zu wechseln, und mit der App interagiert.TouchesBegan Verzögerung auf der linken Seite des Displays

Dies ist ein großes Problem bei der Entwicklung eines Spiels mit SpriteKit, da diese Berührungen jedes Mal um eine Sekunde verzögert werden, wenn ein Benutzer mit dem Finger auf den linken Rand des Bildschirms tippt/hält. Ich war in der Lage, dieses Problem zu lösen, indem ein UILongPressGestureRecognizer in der Hauptszene des Spiels Registrierung, so TouchesBegan und Implementierung eine benutzerdefinierten berührte Funktion (verwendet als Selektor durch die Gestenerkenner) zu deaktivieren:

-(void)handleLongPressGesture:(UITapGestureRecognizer *)gesture { 

    CGPoint location = [gesture locationInView:self.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateEnded) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateCancelled) 
    { 
     // 

    } 
} 

-(void)didMoveToView:(SKView *)view { 
    /* Setup your scene here */ 

    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)]; 

    longPressGestureRecognizer.delaysTouchesBegan = false; 
    longPressGestureRecognizer.minimumPressDuration = 0; 
    [view addGestureRecognizer:longPressGestureRecognizer]; 

    // continue 
} 

Das Problem dabei ist, dass ich eine Gestenerkennung für jede Berührung (einschließlich simultaner) implementieren müsste, von der ich erwarte, dass der Benutzer sie eingibt. Dies stört alle touchesBegan Methoden als Unterklassen von SKSpriteNode, SKScene usw. und tötet eine Menge Funktionalität.

Gibt es eine Möglichkeit, diese Verzögerung zu deaktivieren? Beim Registrieren des GestenRecognizers konnte ich die Eigenschaft delaysTouchesBegan auf false setzen. Kann ich das irgendwie auch für meine SKScene machen?

Um dieses Problem in Aktion zu sehen, können Sie das Standard-SpriteKit-Projekt ausführen und tippen (für eine oder zwei Sekunden) auf die linke Seite des Bildschirms. Sie sehen, dass zwischen dem Berühren des Bildschirms und dem Rendern der SKShapeNodes eine Verzögerung besteht (im Gegensatz zum Berühren einer anderen Stelle auf dem Bildschirm).

* Edit 1 * Für diejenigen, die versuchen, einen Weg zu finden, um diese für jetzt zu bekommen, können Sie die Gestenerkenner halten, sondern setzen ihre cancelsTouchesInView auf false gesetzt. Verwenden Sie den Gestenerkenner, um alles zu tun, was Sie tun müssen, bevor TouchesBegan einsteigt (touchesBegan empfängt das gleiche Berührungsereignis etwa eine Sekunde, nachdem der Gestenerkenner die Berührung erkannt hat). Sobald touchesBegan eingeschaltet wird, können Sie alles, was im Gestenerkenner passiert, deaktivieren. Das scheint mir eine schlampige Lösung zu sein, aber es funktioniert jetzt.

Immer noch versucht, eine mehr oder weniger formale Lösung zu finden.

+1

Das gleiche Problem zu bekämpfen. Noch schlimmer ist, dass Berührungen auf 3D-Touch-Geräten ausgelöst werden, ohne dass die x- oder y-Koordinaten geändert werden, d. H. Sie haben Ihren Finger nicht wirklich bewegt. Ich schaffte es, das zu umgehen, aber ich habe das Problem, das Sie beschrieben haben, nicht gelöst. – crashoverride777

+0

Yup, das gleiche Problem mit den kontinuierlichen Berührungen bewegte Anrufe erlebt. – Andriko13

+0

Auf 3D-Touch-Geräten versuchen und verwenden Force Touch tun etwas in Berührungen bewegt. Zum Beispiel in meinem Spiel habe ich einen Spieler, der schießen würde, wenn Sie tippen und SlowMotion eingeben, wenn Sie streichen und halten. Jetzt verwende ich Force-Touch, um die Druckänderung auf 3D-Touch-Geräten in Zeitlupe zu bringen, und es fühlt sich großartig an. Es ist sehr einfach zu implementieren, nur Google Force Touch Druck ändert. Für Geräte ohne 3D-Touch ist das was ich tue und ich habe noch kein Problem damit, zumindest bei meinen Spielen. http://stackoverflow.com/questions/36060423/swift-spritekit-3d-touch-and-touches-moved – crashoverride777

Antwort

0

Ich habe das als Benutzer erlebt und es ist wirklich nervig. Das Einzige, was für mich funktionierte, war, den 3D-Touch zu deaktivieren. Ansonsten ist die linke Seite des Touchscreens fast nutzlos.

Verwandte Themen