Странная проблема с касаниями, перемещенными несколькими касаниями

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

У меня есть код, который позволяет вам нажимать кнопки и воспроизводить звук для каждой кнопки, а также проводить пальцами по кнопкам и заставлять каждую кнопку воспроизводить соответствующий звук при входе в область кнопки. Он работает довольно хорошо, за исключением странной ошибки:

Если вы нажмете пальцами на две кнопки одновременно, изначально будут воспроизводиться оба звука. Однако, если вы продолжите удерживать пальцы на кнопке, а затем уберете пальцы с экрана, слегка перемещая один из них (все еще в пределах каждой кнопки), он воспроизведет один из звуков двух кнопок. Как я могу предотвратить это? Я хочу, чтобы звуки воспроизводились, только если вы проводите пальцем по кнопкам или нажимаете на них изначально, а не если вы просто слегка перемещаете их, одновременно нажимая на две кнопки, а затем отпускаете палец.

Ниже приведен мой код:

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{   
    NSSet *allTouches = [event allTouches];
    touchesCount = [allTouches count];

    for(UITouch *t in touches) {

        CGPoint location = [t locationInView:t.view];

        if(CGRectContainsPoint(soundButton1.frame, location)) 
        {
            if (!soundButton1.isHighlighted amp;amp; touchesCount < 2){
                soundID = @"0";
                [self playSound];
                [soundButton1 setHighlighted:YES];
            }
        }
        else {
            [soundButton1 setHighlighted:NO];
        }
        if(CGRectContainsPoint(soundButton2.frame, location)) 
        {
            if (!soundButton2.isHighlighted amp;amp; touchesCount < 2){
                soundID = @"1";
                [self playSound];
                [soundButton2 setHighlighted:YES];
            }
        }
        else {
            [soundButton2 setHighlighted:NO];
        }
    }
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    for(UITouch *t in touches) {

        CGPoint location = [t locationInView:t.view];

          if(CGRectContainsPoint(soundButton1.frame, location)) 
        {
            [soundButton1 setHighlighted:YES];
            soundID = @"0";
            [self playSound];
        }
        if(CGRectContainsPoint(soundButton2.frame, location)) 
        {
            [soundButton2 setHighlighted:YES];
            soundID = @"1";
            [self playSound];
        }
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  for(UITouch *t in touches) {
    CGPoint location = [t locationInView:t.view];
         if(CGRectContainsPoint(soundButton1.frame, location)) 
            {
            [soundButton1 setHighlighted:NO];
        }
        if(CGRectContainsPoint(soundButton2.frame, location)) 
        {
            [soundButton2 setHighlighted:NO];
        }
   }
}
  

Комментарии:

1. Кроме того, это может помочь показать вам, что происходит (одновременные нажатия): Кнопка 1 — коснитесь-> перетащите-> кнопка с поднятым пальцем, Кнопка 2 — коснитесь-> перетащите-> слегка переместите -> воспроизводимый звук

Ответ №1:

Попробуйте отключить звуки на короткий (очень) период. В touchesEnded:withEvent: проверьте, есть ли у него два касания, затем сделайте что-то вроде этого,

 soundDisabled = YES;
  

Вы можете либо запросить селектор для запуска после задержки

 [self performSelector:@selector(enableSound) withObject:nil afterDelay:0.2];
  

и затем

 - (void)enableSound {
    soundDisabled = NO;
}
  

Или вы могли бы подождать, пока второй палец поднимется, а затем

 soundDisabled = NO;