如何设置 UIPageViewController(分页类型)手势委托

How can I set UIPageViewController (Paging Type) gestures delegate

我一直在尝试解决 UIPageViewControllers 的手势与添加到视图和位于页面控制器内的 UIViewControllers 上的手势之间的冲突。 我只需要使 UIPageViewController 成为其手势的委托我该怎么做?

  1. 我已经在页面视图中遵循并实现了 UIGestureDelegate 方法,但从未调用过它们。
  2. 我还循环检查 UIPageViewControllers gestureRecognizers 中是否存在手势 属性。正如预期的那样,这个数组为零,如文档“..Only populated if transition style is 'UIPageViewControllerTransitionStylePageCurl'."
  3. 我尝试获取底层 UIScrollView 并将其平移手势委托设置为 UIPageViewController。无法这样做。

如何设置 UIPageViewController 手势(特别是平移手势)的委托。

要设置 UIPageViewController 委托,只需将 "UIPageViewControllerDelegate" 和 "UIPageViewControllerDataSource" 添加到您的 UIPageViewController。然后将您的 UIPageViewController 的委托和数据源设置为自己(委托)。

class MyPageViewController : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
  override func viewDidLoad() {
     super.viewDidLoad()
     self.dataSource = self
     self.delegate = self
   }
}

如果不设置dataSource,将无法实现UIPageViewController视图之间的滑动手势

这不会为 UIPageViewController 的内置平移手势设置手势委托,但我知道如何通过获取底层滚动视图然后在滚动视图上设置新的平移手势来设法解决手势冲突。这个新的 Pan 手势将 UIPageViewController 作为其委托,因此我可以调用手势委托。

-(UIScrollView *)scrollViewInsidePageControl {
    for (UIView * view in self.view.subviews) {
        if([view isKindOfClass:[UIScrollView class]])
            return (UIScrollView *)view;
    }
    return nil;
}

并且在-viewDidLoad:

self.internalScrollView = [self scrollViewInsidePageControl];
self.customPanGesture = [UIPanGestureRecognizer new];
self.customPanGesture.delegate = self;
[self.internalScrollView addGestureRecognizer:_customPanGesture];

以上代码在 UIPageViewController 实例

上调用了 UIGestureRecognizerDelegate 的协议方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if(otherGestureRecognizer.view == self.internalScrollView)
        return NO;
    else
        return YES;
}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer == _customPanGesture)
    {
        // Did required handling here
    }
    return YES;
}