Конфликты UIPanGestureRecognizer

Я добавляю UIPanGestureRecognizer в одно пользовательское представление в моем контроллере представления.

Я также использую MFSideMenu для скользящего меню, которое в своей структуре добавляет UIPanGestureRecognizer к основному NavigationViewController.view.

Иногда, когда я панорамирую в своем пользовательском представлении, панорамирование фактически происходит в MavigationViewController.view.

Причиной этой проблемы является следующий код в реализации MFSideMenu:

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

  if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {

     if([gestureRecognizer.view isEqual:self.rootViewController.view] &&
       [self rootViewControllerPanEnabled])
      {
        return YES;
      }

   return NO;
  }

}

По-видимому, иногда (1 из 5-10) этот метод возвращает ДА, тогда как он должен возвращать НЕТ при панорамировании самого вида!

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

Я перепробовал почти все, что только мог себе представить — такое поведение просто не имеет никакого смысла.

ОБНОВЛЕНИЕ: проблема только в iOS 7 - пожалуйста, смотрите мой ответ ниже для исправления.


person kernix    schedule 25.11.2013    source источник
comment
Я предполагаю, что ваше пользовательское представление добавляется в корневое представление, поэтому оно запускает жестRecognizer в классе корневого представления. Я бы попробовал посмотреть, можете ли вы установить для переменной rootViewControllerPanEnable в корневом представлении значение «Нет» в обработчике метода жеста делегата в вашем пользовательском классе (если время работает).   -  person GuybrushThreepwood    schedule 25.11.2013


Ответы (1)


Нашел решение; Судя по всему проблема в iOS 7.

Чтобы это исправить, просто реализуйте UIGestureRecognizerDelegate в вашем контроллере представления и выполните:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

Это исправило мою случайную проблему!

Авторы UIPanGestureRecognizer иногда не работает на iOS 7

person kernix    schedule 25.11.2013