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

Posted

技术标签:

【中文标题】如何设置 UIPageViewController(分页类型)手势委托【英文标题】:How can I set UIPageViewController (Paging Type) gestures delegate 【发布时间】:2016-01-13 15:38:10 【问题描述】:

我一直在尝试修复 UIPageViewControllers 的手势与添加到视图和位于页面控制器内的 UIViewControllers 的手势之间的冲突。 我只需要让 UIPageViewController 成为其手势的代表,我该怎么做?

    我已经在页面视图中遵循并实现了 UIGestureDelegate 方法,但它们从未被调用过。 我还循环检查 UIPageViewControllers 中的gestureRecognizers 属性中是否存在手势。正如预期的那样,该数组为 nil,如文档“..仅在过渡样式为 'UIPageViewControllerTransitionStylePageCurl' 时才填充。”中所述。 我尝试获取底层 UIScrollView 并将其平移手势委托设置为 UIPageViewController。无法这样做。

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

【问题讨论】:

【参考方案1】:

这不会为 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;

【讨论】:

【参考方案2】:

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

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

如果你不设置dataSource,你将无法让UIPageViewController在视图之间滑动手势。

【讨论】:

此后委托不会收到 UIGestureRecognizerDelegate 协议中提到的方法调用。

以上是关于如何设置 UIPageViewController(分页类型)手势委托的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Xcode 中快速设置 UIPageViewController 的过渡样式?

故事板:如何使用故事板为 UIPageViewController 设置初始视图控制器?

如何在XIB(Interface Builder)中使用UIPageViewController的子类来设置DataSource、Delegate和TransitionStyle

UIPageViewController - 如何在横向模式下自定义左右页面?

UIPageViewController 如何访问不可见页面

如何在 UIPageViewController 和孩子之间正确传递对象