UISwipeGestureRecouncer @selector не вызывается из-за настройки UIPanGestureRecouncer

StackOverflow https://stackoverflow.com//questions/22055625

Вопрос

В моем приложении для iOS у меня есть следующие настройки:

- (void)setupGestures
{
   UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];                                                           
   [self.view addGestureRecognizer:panRecognizer];

   UISwipeGestureRecognizer* swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];

   [swipeUpRecognizer setDirection:UISwipeGestureRecognizerDirectionUp];
   [self.view addGestureRecognizer:swipeUpRecognizer];
}

// then I have following implementation of selectors

// this method supposed to give me the length of the swipe

- (void)panGesture:(UIPanGestureRecognizer *)sender 
{
   if (sender.state == UIGestureRecognizerStateBegan)
   {
      startLocation = [sender locationInView:self.view];
   }
   else if (sender.state == UIGestureRecognizerStateEnded)
   {
      CGPoint stopLocation = [sender locationInView:self.view];
      CGFloat dx = stopLocation.x - startLocation.x;
      CGFloat dy = stopLocation.y - startLocation.y;
      CGFloat distance = sqrt(dx*dx + dy*dy );
      NSLog(@"Distance: %f", distance);
   }
 }

 // this  method does all other actions related to swipes

- (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
 UISwipeGestureRecognizerDirection direction = [gestureRecognizer direction];
     CGPoint touchLocation = [gestureRecognizer locationInView:playerLayerView];

     if (direction == UISwipeGestureRecognizerDirectionDown && touchLocation.y >  (playerLayerView.frame.size.height * .5))
     {
        if (![toolbar isHidden])
        {
           if (selectedSegmentIndex != UISegmentedControlNoSegment)
           {
              [self dismissBottomPanel];
           }
           else
           {
             [self dismissToolbar];
           }
        }
     }
 }

Итак, проблема в том, что handleSwipe никогда не вызывается... когда я комментирую настройку UIPanGestureRecouncer, handleSwipe начинает работать.

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

Любая помощь очень ценится!

Это было полезно?

Решение

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

Чтобы они оба работали, сделайте свой класс delegate за жесты и реализацию

– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

вернуться YES.

Чтобы настроить один на работу только в случае сбоя другого, используйте requireGestureRecognizerToFail:.

Другие советы

Продолжительностью и жесткие жесты очень похожи, и это вызывает путаницу,

Есть несколько лекарств:

  1. Не настроить сковороду и промах на том же представлении - он может быть установлен на разных подсвечении для предотвращения смущения.

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

  3. Используйте метод делегата - GestureReCognizal: Desberequireciredtofailby GresetureCognizer:

    Например, Chaco Если прикосновения начались в области панели / панели инструментов и отказом от распознавателя панорамирования, позволяя использовать промах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top