2016-10-26 9 views
0

여러 UIViewController를 보유하고있는 UIPageViewController가 있습니다. 각 UIViewController의 뷰에는 하위 뷰 MyUIView가 있습니다. MyUIView에서 touchesBegan 및 다른 모든 3 가지 메소드를 오버라이드합니다.UIPageViewController가 취소 된 자식 UIView를 터치합니다.

MyUIView에서 위로 아래로 스 와이프하면 -touchesMoved : withEvent : 아무 문제없이 호출되었지만 왼쪽에서 오른쪽으로 스 와이프하면 UIPageViewController가 스크롤되고 MyUIView의 -touchesCancelled : withEvent :가 호출되었습니다.

이 4 가지 메서드에서 [super touchesXXX : withEvent :]를 호출하지 않았으므로 UIPageViewController가 터치 이벤트를받지 못하게해야한다고 생각했지만 어떻게 든 UIPageViewController가 스 와이프를 인식하고 취소 된 MyUIView를 터치 한 것처럼 보였습니다.

그리고 또 다른 세부 사항을 알았습니다. MyUIView를 터치하고 왼쪽에서 오른쪽으로 매우 느리게 그리고 아주 조금 멀리 이동하면 여전히 -touchesMoved : withEvent :가 호출됩니다. 그러나 일정한 거리 (어쩌면 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; 
      } 
     }]; 
    } 
}];