2010-07-26 3 views
6

Итак, вот странный вопрос. У меня есть UIImageView, который отвечает на touchesMoved: & touchesBegan:, он отлично работает. Главное, с чем я столкнулся, - это если вы положите палец вниз на изображение image1, а затем с тем пальцем, который все еще находится на изображении1, вы бы нажали image2 другим пальцем.touchsBegan & touchesMoved

В свою очередь, это снова выстрелило бы image1. Не хочу, чтобы это произошло. Я хочу, чтобы иметь возможность использовать Multi Touch при одновременном нажатии обоих изображений, а не повторять их снова и снова. Должно быть что-то, что я должен добавить, чтобы это не происходило.

Код:

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

    } 

И для 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; 
     } 

    } 

Наконец вот финал:

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

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

Так что я просто нужно сделать так, если я удерживая одно из изображений, а затем нажмите другое и отпустите его снова и снова нажмите, чтобы он не загорелся первым изображением. Я нажимаю ng вниз.

ответ

0

Используйте касание NSSet, которое передается в ваш метод touchesBegan:, а не allTouches:.

+0

Как бы вы это описали? Я попытался с помощью: - (Недействительными) touchesBegan: (NSSet *) касается withEvent: (UIEvent *) событие { \t UITouch * сенсорный = [[touchesForView событие: self.view] anyObject]; \t \t CGPoint location = [touch locationInView: touch.view]; Я не думаю, что это то, что вы имели в виду. Помните, что я это точно понимаю. Благодарю. – AndrewDK

+0

Одним из параметров этого метода является NSSet *, который затрагивает затронутые проблемы. Итак, в - (void) touchhesBegan: (NSSet *) затрагивает событиеEvent: (UIEvent *) event {...} просто используйте *, который * касается переменной. Этот набор будет содержать прикосновения, которые начались во время этого события. - (void) touchesBegan: (NSSet *) затрагивает событиеEvent: (UIEvent *) { UITouch * touch = [касается любого объекта]; // что вы хотите сделать с сенсорным ... } –

+0

Да, спасибо за разъяснение, он все еще не работает. Когда у меня есть палец на одном изображении, а затем нажмите еще один, он все равно выстрелит. Также, когда я пытаюсь нажать два изображения сразу, они срабатывают, а затем первый удар снова выстрелит с этим прикосновением. Это действительно странно. – AndrewDK

1

Все рассматриваемые виды будут получать все касания (в NSSet, как упоминалось Джейсоном). Это зависит от каждого вида (до вас, то есть), выбранного вами, который вас интересует. Поэтому вам нужно проверить, находится ли каждое касание внутри пределов представления, и попытаться сопоставить касание с последним полученным. Так как вы получаете штрихи в наборе, вы не можете рассчитывать на их порядок, чтобы рассчитать, сколько они двигались, например. Вы должны сохранить координаты последнего касания и выбрать самое близкое касание и предположить, что это тот же самый палец, который переместился.

+0

Немного смущает, я понимаю, что вы имеете в виду. Я должен поиграть с ним немного больше. – AndrewDK

Смежные вопросы