2010-07-26 10 views
6

Oto dziwne pytanie. Mam UIImageView, który odpowiada na touchesMoved: & touchesBegan:, działa idealnie. Najważniejszą rzeczą, z którą mam problem jest to, że jeśli położysz palec na powiedz obrazie1, a następnie z tym palcem w dół na obrazie1, możesz nacisnąć image2 drugim palcem.touchBegan & touchesMoved

To z kolei spowoduje ponowne uruchomienie obrazu1. Nie chcę, żeby tak się stało. Chciałbym móc korzystać z Multi Touch podczas przesuwania obu obrazów jednocześnie i nie strzelać ich w kółko. Musi być coś, co muszę dodać, żeby to się nie stało.

Kod:

-(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; 
     } 

    } 

A dla 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; 
     } 

    } 

Wreszcie oto finał:

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

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

Więc po prostu trzeba to zrobić tak, jeśli jestem Przytrzymując jeden z obrazów, a następnie naciśnij inny i zwolnij go ponownie i naciśnij ponownie, aby zatrzymać wypalanie pierwszego obrazu Jestem pressi ng w dół.

Odpowiedz

0

Użyj dotknięć NSSet, które są przekazywane do metody touchesBegan:, a nie allTouches: ze zdarzenia.

+0

Jak byś to napisał? że próbuje się z: - (void) touchesBegan (NSSet *) dotyka withEvent (UIEvent *) zdarzenie { \t UITouch dotykowy * = [[zdarzenie touchesForView: self.view] anyObject]; \t \t Lokalizacja CGPoint = [touch locationInView: touch.view]; Nie sądzę, że o to ci chodziło. Pamiętaj, żeby to napisać, więc rozumiem dokładnie. Dzięki. – AndrewDK

+0

Jednym z parametrów tej metody jest NSSet *, który dotyczy dotknięć, których dotyczy. Tak więc w - (void) touchsBegan: (NSSet *) dotyka zdarzenia Event: (UIEvent *) {...} wystarczy użyć *, że * dotyka zmiennej. Ten zestaw będzie zawierał dotyk (y), które rozpoczęły się podczas tego wydarzenia. - (void) touchesBegan: (NSSet *) dotyka zEvent: (UIEvent *) zdarzenie { UITouch * touch = [dotyka anyObject]; // cokolwiek chcesz zrobić z dotykiem ... } –

+0

Tak, dziękuję za wyjaśnienie, to nadal nie działa. Kiedy kładę palec na jednym obrazie, a następnie naciskam inny, nadal to wystrzeli. Jak dobrze, kiedy spróbuję nacisnąć 2 obrazy jednocześnie, wystrzelą, a wtedy pierwsze trafienie ponownie wystrzeli z tego dotyku. To naprawdę dziwne. – AndrewDK

1

Wszystkie widoki, które są zaangażowane, otrzymają wszystkie dotknięcia (w NSSet, o czym wspomniał Jason). Od każdego widoku (aż do ciebie) zależy wybór, który cię interesuje. Musisz więc sprawdzić, czy każdy dotyk znajduje się w granicach widoku, i spróbować skorelować dotyk z ostatnim otrzymanym. Ponieważ dostaniesz dotknięcia w zestawie, nie możesz polegać na ich zamówieniu, aby obliczyć, na przykład, ile się poruszyły. Musisz zapisać współrzędne ostatniego dotknięcia i wybrać najbliżej dotyku i przyjąć, że to ten sam palec, który się poruszył.

+0

Trochę zagmatwany, widzę co masz na myśli. Będę musiał się trochę rozejrzeć. – AndrewDK

Powiązane problemy