UISlider + UISwipeGestureRecognizer не работает в первый раз

В моем основном контроллере представления у меня есть uislider. и в то же время я назначаю UISwipeGestureRecognizer для self.view, так как я хочу обнаруживать жесты во всем представлении.

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

Вот мой код (часть жеста)

UISwipeGestureRecognizer* singleSwipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeRight:)];
    [singleSwipeRight setDirection:(UISwipeGestureRecognizerDirectionRight)];
    singleSwipeRight.numberOfTouchesRequired = 1;
    singleSwipeRight.delegate = self;
    [self.view addGestureRecognizer: singleSwipeRight];

Как я прочитал в ЗДЕСЬ, чтобы предотвратить это, просто реализуйте следующий делегат:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {


    if ([touch.view isKindOfClass:[UISlider class]]) {
        // prevent recognizing touches on the slider
        //NSLog(@"no");
        return NO;
    }
    return YES;

}

Но самое смешное, что это работает только во второй раз, когда я сдвигаю UISlider. Первое пролистывание ВСЕГДА переходит к обработчику распознавания жестов.

Почему? И как это решить?

Спасибо.


person GeneCode    schedule 01.07.2012    source источник


Ответы (2)


В методе shouldReceiveTouch добавьте эту строку:

NSLog(@"touch.view class = %@", [touch.view className]);

Это укажет имя класса того, что вы получаете для первого касания.

Вы также должны проверить свойство phase; вы можете захотеть вернуть YES только после завершения свайпа (в зависимости от того, как работает ваше приложение).

person Aaron Brager    schedule 01.07.2012
comment
Только что проверил. журнал говорит UIView. Кстати, я использовал [класс touch.view], для этого представления нет свойства className. Хотя не знаю, как поступить. UISlider находится внутри другого UIView, который находится в self.view. Может ли это быть причиной? Если да, то как мне это исправить? любая идея? - person GeneCode; 01.07.2012
comment
Да, поэтому я удалил ползунок из дочернего представления, и теперь он работает нормально. Хотелось бы знать, можно ли проверить ползунок, который находится в другом представлении. В любом случае спасибо! - person GeneCode; 01.07.2012
comment
Нет. На самом деле это не сработало. Независимо от того, находится ли ползунок внутри подпредставления или нет, первое представление по-прежнему определяется как UIView, хотя я осторожно касаюсь UISlider. Я буду исследовать больше ... надеюсь, я смогу найти что-нибудь. - person GeneCode; 02.07.2012

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

    UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:nil action:nil];
[slider addGestureRecognizer:panGesture];
panGesture.cancelsTouchesInView = NO;

Вот и все!

person Mayosse    schedule 20.03.2013
comment
@Mayosse Отличный ответ. Моя проблема заключалась в том, что ползунок продолжал останавливаться до того, как пользователь заканчивал скользить по экрану. Это решило проблему полностью! Спасибо! - person kbpontius; 11.03.2016