2016-10-26 7 views
0

У меня есть UIPageViewController, который содержит несколько UIViewControllers. У каждого представления UIViewController есть subview: MyUIView. Я переопределяю touchsBegan и все остальные 3 метода в MyUIView.UIPageViewController отменил дочерние UIView touch

Когда я прокручиваю снизу в MyUIView, я получил -touchesMoved: withEvent: вызвал без проблем, но когда я прокручиваю слева направо, прокручивается UIPageViewController, и -touchesCancelled: withEvent: в MyUIView вызывается.

Я не называл [super touchhesXXX: withEvent:] в этих 4 методах, я думал, что это должно остановить UIPageViewController от получения событий касания, но почему-то казалось, что UIPageViewController распознал салфетки и отменил ссылки MyUIView.

И я заметил еще одну деталь, если я касаюсь MyUIView и двигаюсь слева направо очень медленно и на очень небольшое расстояние, у меня все еще есть -touchesMoved: withEvent: called. Но после определенного расстояния (возможно, 10 очков) UIPageViewController, похоже, распознал прокрутку и прокрутку и одновременно отменил касания в MyUIView.

Вопрос в том, что произошло? Как использовать события касания в MyUIView и прекратить переадресацию события вверх по течению?

ответ

0

После использования функции Xcode "отлаживать вид иерархии", я нахожу просмотр иерархии UIPageViewController.view:

enter image description here

_UIQueuingScrollView выглядит подозрительно, поэтому я зарегистрировал его жест распознавателей:

2016-10-26 19:02:16.846 LSYReader[5202:293575] _UIQueuingScrollView gesture:<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x6080001b4f20; state = Possible; delaysTouchesBegan = YES; view = <_UIQueuingScrollView 0x7f884003ba00>; target= <(action=delayed:, target=<_UIQueuingScrollView 0x7f884003ba00>)>> 
2016-10-26 19:02:16.848 LSYReader[5202:293575] _UIQueuingScrollView gesture:<UIScrollViewPanGestureRecognizer: 0x7f883e70a240; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x7f884003ba00>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x7f884003ba00>)>; must-fail = { 
    <UIScrollViewPagingSwipeGestureRecognizer: 0x6080001dc5c0; state = Possible; view = <_UIQueuingScrollView 0x7f884003ba00>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x7f884003ba00>)>> 
}> 
2016-10-26 19:02:16.849 LSYReader[5202:293575] _UIQueuingScrollView gesture:<UIScrollViewPagingSwipeGestureRecognizer: 0x6080001dc5c0; state = Possible; view = <_UIQueuingScrollView 0x7f884003ba00>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x7f884003ba00>)>; must-fail-for = { 
    <UIScrollViewPanGestureRecognizer: 0x7f883e70a240; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x7f884003ba00>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x7f884003ba00>)>> 
}> 

А потом я отключил эти распознаватели жестов, теперь все отлично работает в MyUIView.

[_pageViewController.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 

    if ([obj isKindOfClass:NSClassFromString(@"_UIQueuingScrollView")]) { 
     [obj.gestureRecognizers enumerateObjectsUsingBlock:^(__kindof UIGestureRecognizer * _Nonnull obj1, NSUInteger idx1, BOOL * _Nonnull stop1) { 
      if ([obj1 isKindOfClass:NSClassFromString(@"UIScrollViewDelayedTouchesBeganGestureRecognizer")]) { 
       obj1.enabled = NO; 
      } else if ([obj1 isKindOfClass:NSClassFromString(@"UIScrollViewPanGestureRecognizer")]) { 
       obj1.enabled = NO; 
      } else if ([obj1 isKindOfClass:NSClassFromString(@"UIScrollViewPagingSwipeGestureRecognizer")]) { 
       obj1.enabled = NO; 
      } 
     }]; 
    } 
}];