2010-07-26 4 views
6

Also hier ist eine seltsame Frage. Ich habe eine UIImageView, die auf touchesMoved: & touchesBegan: reagiert, es funktioniert perfekt. Die Hauptsache, mit der ich ein Problem habe, ist, wenn du deinen Finger auf sag image1 legst und dann mit diesem Finger immer noch auf image1 warst, würdest du image2 mit deinem anderen Finger drücken.berührtBegan & berührtMoved

Dies wiederum würde Bild1 erneut auslösen. Ich will nicht, dass das passiert. Ich möchte Multi Touch verwenden können, wenn ich beide Bilder gleichzeitig schiebe und nicht immer wieder feuere. Es muss etwas geben, das ich hinzufügen muss, um das zu verhindern.

Code:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSSet *allTouches = [event allTouches]; 
    for (UITouch *touch in allTouches) 
    { 
     CGPoint location = [touch locationInView:touch.view]; 
     if(CGRectContainsPoint(image1.frame, location) && lastButton != image1) { 
      //Play Sound 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"sound1" 
                  ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path] 
              , &soundID); 
      AudioServicesPlaySystemSound (soundID); 
      // 
      lastButton = image1; 
     } 
     if(CGRectContainsPoint(image2.frame, location) && lastButton != image2) { 
      //Play Sound 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"sound2" 
                  ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path] 
              , &soundID); 
      AudioServicesPlaySystemSound (soundID); 
      // 
      lastButton = image2; 
     } 

    } 

Und für die touchesMoved:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
     if(CGRectContainsPoint(image1.frame, location) && lastButton != image1) { 
      //Play Sound 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"sound1" 
                  ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path] 
              , &soundID); 
      AudioServicesPlaySystemSound (soundID); 
      // 
      lastButton = image1; 
     } 
     if(CGRectContainsPoint(image2.frame, location) && lastButton != image2) { 
      //Play Sound 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"sound2" 
                  ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path] 
              , &soundID); 
      AudioServicesPlaySystemSound (soundID); 
      // 
      lastButton = image2; 
     } 

    } 

Schließlich sind hier die Endrunde:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    lastButton = nil; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self touchesEnded:touches withEvent:event]; 
} 

Also muss ich es einfach so machen, wenn ich bin Halten Sie eines der Bilder gedrückt und drücken Sie dann ein anderes und lassen Sie es wieder los und drücken Sie es erneut, dass es aufhört, das erste Bild zu schießen, das ich pressi bin ng runter.

Antwort

0

Verwenden Sie die Berührungen NSSet, die an Ihre touchesBegan: Methode übergeben werden, anstatt allTouches: aus dem Ereignis.

+0

Wie würden Sie das schreiben? ich versucht, mit: - (void) touchesBegan: (NSSet *) berührt Withevent: (UIEvent *) Ereignis { \t UITouch * Touch = [[Ereignis touchesForView: self.view] ANYOBJECT]; \t \t CGPoint-Standort = [Touch locationInView: touch.view]; Ich glaube nicht, dass das, was Sie meinten, obwohl. Denk daran, es so zu schreiben, dass ich es genau verstehe. Vielen Dank. – AndrewDK

+0

Einer der Parameter für diese Methode ist ein NSSet *, der die Berührungen betrifft, die betroffen sind. Also in - (void) touchesBegan: (NSSet *) berührt mitEvent: (UIEvent *) Ereignis {...} verwenden Sie einfach * das * berührt Variable. Dieser Satz enthält die Berührung (en), die während dieses Ereignisses begonnen haben. - (void) touchesBegan: (NSSet *) Berührungen withEvent: (UIEvent *) Ereignis { UITouch * touch = [berührt anyObject]; // was auch immer Sie mit Touch tun möchten ... } –

+0

Ja danke für die Klärung, es funktioniert immer noch nicht. Wenn ich einen Finger auf ein Bild drücke und dann einen anderen drücke, wird es immer noch feuern. Wenn ich zwei Bilder auf einmal schieße, feuern sie und dann wird der erste Treffer mit dieser Berührung wieder ausgelöst. Es ist wirklich komisch. – AndrewDK

1

Alle Ansichten, die beteiligt sind, erhalten alle Berührungen (in der NSSet wie von Jason erwähnt). Es liegt an jeder Ansicht (bis zu Ihnen), ausgewählt zu werden, welche Berührungen Sie interessieren. Sie müssen also überprüfen, ob sich jede Berührung innerhalb der Grenzen der Ansicht befindet, und versuchen, die Berührung mit der zuletzt empfangenen zu korrelieren. Da Sie die Berührungen in einem Satz erhalten, können Sie sich nicht darauf verlassen, dass ihre Reihenfolge berechnet, wie viel sie zum Beispiel bewegt haben. Sie müssen die Koordinaten der letzten Berührung speichern und die Berührung auswählen, die am nächsten ist, und davon ausgehen, dass es sich um denselben Finger handelt, der sich bewegt hat.

+0

Ein bisschen verwirrend, ich sehe was du meinst. Ich muss etwas mehr herumspielen. – AndrewDK