Проблема с жестами: UISwipeGestureRecognizer + UISlider - PullRequest
21 голосов
/ 22 января 2011

У меня проблема с жестом. Я реализовал UISwipeGestureRecognizer, чтобы получить события левого и правого пролистывания, и это работает нормально. Однако проблема, с которой я сталкиваюсь, состоит в том, что UISlider, который я имею в том же виде, не играет хорошо. Скользящее движение ползунков ошибочно принимается за движение влево / вправо.

Кто-нибудь сталкивался с этой проблемой раньше, есть идеи, как ее исправить?

Большое спасибо.

Вот код, содержащийся в контроллере вида:

 - (void)viewDidLoad {

            [super viewDidLoad];

                //Setup handling of LEFT and RIGHT swipes
             UISwipeGestureRecognizer *recognizer;

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];

                recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
                [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
                [[self view] addGestureRecognizer:recognizer];
                [recognizer release];
        }

    -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {

      if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
       NSLog(@"Swipe Right");
       //Do stuff
      }

      if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
       NSLog(@"Swipe Left");
       //Do stuff
      }
    }

Ответы [ 3 ]

56 голосов
/ 22 января 2011

Простейший способ справиться с этим, вероятно, состоит в том, чтобы запретить распознавателю жестов видеть прикосновения на вашем слайдере. Вы можете сделать это, установив себя в качестве делегата, а затем реализовав

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UISlider class]]) {
        // prevent recognizing touches on the slider
        return NO;
    }
    return YES;
}

Если это не сработает, возможно, слайдер на самом деле имеет подпредставления, которые получают прикосновение, поэтому вы можете пройтись по цепочке superview, проверяя каждый вид по пути.

0 голосов
/ 09 января 2019

Swift 4.0 версия. Не забудьте UEGestureRecognizerDelegate.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {

    if let touchedView = touch.view, touchedView.isKind(of: UISlider.self) {
        return false
    }

    return true
}
0 голосов
/ 22 января 2011

Я закончил тем, что все заработало как раз перед тем, как Лили ответила выше. Вот код, который я использовал, но выглядит Лили чище (не проверял ты Лили):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    BOOL AllowSwipes = YES;

        CGPoint point1 = [touch locationInView:_sliderLeft];
        CGPoint point2 = [touch locationInView:_sliderRight];

        //Left slider test
        if ([_sliderLeft hitTest:point1 withEvent:nil] != nil) {
            AllowSwipes = NO;
            NSLog(@"On Left Slider");
        }

        //Right slider test
        if ([_sliderRight hitTest:point2 withEvent:nil] != nil) {
            AllowSwipes = NO;
            NSLog(@"On Right Slider");
        }
    }
    return AllowSwipes;
}
...