2014-03-02 4 views
11

genannt wird Ich habe das Spiel mit den Noten in einer iOS-Anwendung zu erkennen, und ich habe diesen einfachen CodeTouches Ended nicht

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"%lu",(unsigned long)[touches count]); 
[touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
    UITouch *touch = obj; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 
    NSLog(@"B x:%f - y:%f",touchLocation.x,touchLocation.y); 
}]; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
[touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
    UITouch *touch = obj; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 
    NSLog(@"E x:%f - y:%f",touchLocation.x,touchLocation.y); 
}]; 
} 

Die touchesBegan fein aufgerufen wird, wenn ich von 1 Finger lege bis zu 5 Finger auf dem Bildschirm zur gleichen Zeit, ich sehe es mit der richtigen Information aufgerufen

Das gleiche passiert nicht mit touchesBegan, viel Zeit, wenn ich 3 Finger auf dem Bildschirm habe und sie gleichzeitig entfernen, sehe ich nur Informationen über 2 Berührungen werden beendet (und manchmal sogar 1). Wenn ich die Finger nacheinander herausnehme, wird die Methode auch 2-mal aufgerufen (manchmal 1, obwohl es selten 3-mal richtig heißt). Wenn die Anzahl der Berührungen steigt, wird auch die Wahrscheinlichkeit einiger Informationen nicht mehr berücksichtigt in der touchesEnded Methode

Methoden touchesMoved:withEvent: und touchesCancelled:withEvent: sind ebenfalls implementiert, mit der gleichen Logik wird

gezeigt

jemand dieses Verhalten erklären kann? Gibt es etwas, das mir fehlt?

+0

Haben Sie dieses Problem beheben? – 0x141E

+0

Gab es eine akzeptierte Antwort? – noobsmcgoobs

Antwort

5

Sie müssen alle Touch-Methoden überschreiben, wenn Sie die Super-Implementierung nicht aufrufen. Sie müssen also auch die Methoden touchesMoved:withEvent: und touchesCancelled:withEvent: implementieren. Implementierungen können leer sein, aber Sie müssen es tun.

touchesBegan:withEvent:

Wenn Sie diese Methode überschreiben, ohne Super Aufruf (eine gemeinsame Nutzung Muster), müssen Sie auch die anderen Methoden außer Kraft setzen für den Umgang mit Touch Ereignisse, wenn auch nur als Stummel (leer) Implementierungen .

Basierend auf UIResponder Class Reference

+2

Ich habe diese Informationen der Kürze halber nicht hinzugefügt, aber ich habe alle 4 Methoden implementiert – sahmed24

+1

Ich habe alle 4 implementiert, aber ich berührtEssen wird immer noch nicht – 1337holiday

1

Versuchen Sie, die UIView ‚s hitTest Methode überschrieben:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    return self; 
} 

Es ist möglich, dass, wenn Sie die Finger heben sie nicht erkannt werden in der UIView als, so touchesEnded ist nicht angerufen.

+0

Ich habe dies schon einige Male mit Menschen mit ähnlichen Problemen stecken –

17

Versuchen Sie, alle Gesture Recognizer zu entfernen, die Sie in dieser Ansicht haben. Sie können touchesEnded stören.

+0

All Veranstaltungen ? Würden sich Wisch- und Berührungsereignisse gegenseitig stören? – 3366784

+1

Ich erlebe das gleiche auch, wenn mehrere Gestenerkenner die '' -touchesEnded: '' '' '' '' '' '' '' '' ''' '' '' 'für einen von ihnen entfallen können. ** Wichtig: ** verlassen Sie sich nicht auf diese Methoden, um Ihren Gestenerkennungsstatus zurückzusetzen/aufzuräumen. Stattdessen überschreiben Sie die '' '-reset''' Methode für Ihre Aufräumlogik, die aufgerufen wird, obwohl' '' -touchesEned: '' '' '' -touchesCanelled: '' 'not. – griga13

+0

Du hast mich gerettet! Vielen Dank. Funktioniert perfekt. – BEm

0

Ich hatte das gleiche Problem und löste es mit diesem einfachen Code in den Berührungen beendet:

NSInteger touchCount = 0; 
for (UITouch *touch in touches) { 
    touchCount++; 
    if([[event allTouches]count] == touchCount){ 
     // do what you have to do here 
    } 
} 

// Sie hier eine Warnung erhalten, aber kümmern sich nicht um sie

ich diese Hoffnung Hilfe!

18

Du müss recognizer.cancelsTouchesInView = false in Swift setzen oder recognizer.cancelsTouchesInView = NO; in Objective-C