UISwipeGestureRecognizer не работает - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть UIView внутри UIScrollView, оба созданы с использованием IB. UIView прокручивается горизонтально внутри UIScrollView. Я хочу обнаружить два пальца влево и вправо.

Заимствуя из примера кода, который я нашел в SmpleGestureRecognizers , я поместил следующий код в метод viewDidLoad объекта ViewController UIScrollView ...

UIGestureRecognizer *recognizer;
UISwipeGestureRecognizer *swipeRightRecognizer, *swipeLeftRecognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:swipeRightRecognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeLeftRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeLeftRecognizer.numberOfTouchesRequired = 2;
swipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeftRecognizer];
[recognizer release];

Я установил в viewcontroller.h. и иметь следующий метод делегата ...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   return YES;
}

Я предполагаю, что это допустимый метод делегата gestRecognizer, но я не могу найти ссылку на него в документации.

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

Я добавляю жест-распознаватель к нужному виду? Я попытался добавить его в UIView, UIScrollView, а также self.view.superView.

Пример кода работает отлично. Единственное различие, которое я вижу между моей реализацией кода и примера кода, заключается в том, что я использовал IB для создания представлений, а пример кода - нет. Я подозреваю, что что-то потребляет жест смахивания до того, как оно попадет к моим распознавателям.

Что я делаю не так.

Спасибо

John

Ответы [ 3 ]

7 голосов
/ 04 августа 2011

У меня была та же проблема, и я решил ее с помощью UIPanGestureRecognizer вместо UISwipeGestureRecognizer.

Чтобы эмулировать обнаружение пролистывания, мы будем играть со скоростью жеста в просмотре прокрутки.Если скорость направления x> = 3000 (например), будет обнаружен пролистывание.

Если x> 0, это будет пролистывание вправо.

Код, который я реализовал, чтобы разрешить вашу ситуациюis: В uiscrollview с именем _scroll1:

UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(Swipe4ScrollViews:)];
[pan setMinimumNumberOfTouches:2];
[_scroll1 addGestureRecognizer:pan];
[pan release];

С глобальной переменной BOOL с именем _panning Swipe4ScrollViews выполнит сложную работу:

-(void)Swipe4ScrollViews:(UIPanGestureRecognizer *)sender 
{
    if(sender.state == UIGestureRecognizerStateBegan) _panning = NO;

    CGPoint v =[sender velocityInView:_scroll1];

    NSLog(@"%f, %f",v.x,v.y);

    if( (abs(v.x) >= UMBRAL) && !_panning)
    {
        _panning = YES;
        [sender cancelsTouchesInView];

        if(v.x>0) NSLog(@"Right");
        else NSLog(@"Left");

        [self doSomething];
    }
}

Я инкапсулировал ее в подкласс UIGestureRecognizer: UISwipe4ScrollGestureRecognizer

1 голос
/ 11 января 2011

Попробуйте установить свойство delayContentTouches для UIScrollView в NO, возможно, это поможет.

1 голос
/ 10 декабря 2010

Самое большое различие между примером кода и вашим кодом состоит в том, что ваш код включает UIScrollView.

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

...