UIScrollView cancels UIPageViewController gestures when scrolling

删除回忆录丶 提交于 2019-12-01 06:31:56

A UIScrollView scroll event will block other UIView animations, so in the case of Twitter, they're probably canceling the scroll a split second before swiping the view. As you've asked in your question:

"How do I cancel the scrollviews gestures if the UIPageViewController is trying to use the gesture to turn the page by tapping or panning the page to cause the page turn animation?"

I'll suggest a workaround.

Instead of relying on the UIPageViewController's inherent UIPanGestureRecognizer, include your own UIPanGestureRecognizer in the page view so that when a pan is detected in the appropriate section of the page and performed in the appropriate direction, that new UIPanGestureRecognizer overrides the UIPageViewController's UIGestureRecognizers and triggers the necessary actions. Specifically, you need to:

(1) Halt the scrolling animation using

CGPoint offset = scrollView.contentOffset;
[scrollView setContentOffset:offset animated:NO];

(2) Turn the page programmatically using

- (void)setViewControllers:(NSArray *)viewControllers direction:
  (UIPageViewControllerNavigationDirection)direction animated:
  (BOOL)animated completion:(void (^)(BOOL finished))completion;

so that both the scrolling animation is halted and the page flip is completed within one fluid pan gesture.

UIGestureRecognizer class has possibility to set dependencies on other gesture recognisers by using requireGestureRecognizerToFail: method.
In your case this method could be used in such way:

for (UIGestureRecognizer *gestureRecognizer in pageController.gestureRecognizers) {
    for (ViewController *viewController in viewControllers) {
        for (UIGestureRecognizer *gestureRecognizerForFail in viewController.scrollView.gestureRecognizers) {
            [gestureRecognizerForFail requireGestureRecognizerToFail:gestureRecognizer];
        }
    }
}

I had the same issue and I worked my way around... in my case I have pdf with zooming enabled. So I have for example:

[scrollView setMaximumZoomScale:6];
[scrollView setMinimumZoomScale:1];

when I initialize the controller and its scrollView, and just after that and every time I change orientation or page I change the zoom to fit the width of the page, only if the zoom is "far away"

CGFloat desiredWidth = scrollView.frame.size.width/pdfRect.size.width;
if (desiredWidth>[self zoomScale]) {
    [scrollView setZoomScale:desiredWidth animated:YES];
}

I hope it helps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!