如何禁用UIPageViewController的滑动手势?

use*_*978 114 uiviewcontroller uigesturerecognizer ios uipageviewcontroller

在我的情况下,父UIViewController包含UIPageViewController哪个包含UINavigationController哪个包含UIViewController.我想向最后一个视图控制器添加滑动手势,但滑动处理就像它们属于页面视图控制器一样.我尝试以编程方式和通过xib执行此操作,但没有结果.

据我了解,在UIPageViewController处理手势之前我无法实现目标.如何解决这个问题?

Jes*_*edc 237

记录的防止UIPageViewController滚动的方法是不分配dataSource属性.如果您分配数据源,它将进入"基于手势"的导航模式,这是您要阻止的.

如果没有数据源,您可以在需要时使用setViewControllers:direction:animated:completion方法手动提供视图控制器,并且它将根据需要在视图控制器之间移动.

以上内容可以从Apple的UIPageViewController文档(概述,第二段)中推断出来:

要支持基于手势的导航,必须使用数据源对象提供视图控制器.

  • 这不是删除屏幕底部的点吗?如果你没有滑动也没有点,那么使用PageViewController就没什么意义了.我猜是提问者想留点. (8认同)
  • 在响应文本字段子视图的键盘通知时,禁用数据源会导致问题.迭代视图的子视图以查找UIScrollView似乎更可靠. (3认同)

use*_*978 82

for (UIScrollView *view in self.pageViewController.view.subviews) {

    if ([view isKindOfClass:[UIScrollView class]]) {

        view.scrollEnabled = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个保持页面控制,这很好. (5认同)

lee*_*lee 49

我将user2159978的答案翻译成Swift

func removeSwipeGesture(){
    for view in self.pageViewController!.view.subviews {
        if let subView = view as? UIScrollView {
            subView.scrollEnabled = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Lin*_*rth 25

实施@lee(@ user2159978)解决方案作为扩展:

extension UIPageViewController {
    var isPagingEnabled: Bool {
        get {
            var isEnabled: Bool = true
            for view in view.subviews {
                if let subView = view as? UIScrollView {
                    isEnabled = subView.isScrollEnabled
                }
            }
            return isEnabled
        }
        set {
            for view in view.subviews {
                if let subView = view as? UIScrollView {
                    subView.isScrollEnabled = newValue
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:(中UIPageViewController)

self.isPagingEnabled = false
Run Code Online (Sandbox Code Playgroud)


Aus*_*tin 9

编辑:此答案仅适用于页面卷曲样式.Jessedc的答案要好得多:无论风格如何都有效,并依赖于记录在案的行为.

UIPageViewController 暴露其手势识别器数组,您可以使用它来禁用它们:

// myPageViewController is your UIPageViewController instance
for (UIGestureRecognizer *recognizer in myPageViewController.gestureRecognizers) {
    recognizer.enabled = NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 看来你的解决方案适用于页面卷曲样式,但在我的应用程序中我使用滚动视图样式 (11认同)
  • 你测试过代码了吗?myPageViewController.gestureRecognizers始终为空 (8认同)
  • 不适用于水平滚动.返回的值始终为空数组. (8认同)

Jam*_*son 9

我已经打了一段时间了,我认为我应该发布我的解决方案,继耶塞德克的回答之后; 删除PageViewController的数据源.

我将它添加到我的PgeViewController类(链接到故事板中的页面视图控制器,继承UIPageViewControllerUIPageViewControllerDataSource):

static func enable(enable: Bool){
    let appDelegate  = UIApplication.sharedApplication().delegate as! AppDelegate
    let pageViewController = appDelegate.window!.rootViewController as! PgeViewController
    if (enable){
        pageViewController.dataSource = pageViewController
    }else{
        pageViewController.dataSource = nil
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以在每个子视图出现时调用它(在这种情况下禁用它);

override func viewDidAppear(animated: Bool) {
    PgeViewController.enable(false)
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人,它不像我想的那样干净,但不会觉得太hacky等.

编辑:如果有人想将其翻译成Objective-C请做:)


Car*_*lin 5

如果您希望UIPageViewController保持其滑动功能,同时允许内容控件使用其功能(滑动以删除等),只需canCancelContentTouches在中将其关闭即可UIPageViewController

将此放入您UIPageViewControllerviewDidLoadfunc。(迅速)

if let myView = view?.subviews.first as? UIScrollView {
    myView.canCancelContentTouches = false
}
Run Code Online (Sandbox Code Playgroud)

UIPageViewController有一个自动生成的子视图处理该手势。我们可以防止这些子视图取消内容手势。

从...

滑动以删除pageViewController内的tableView


小智 5

一个有用的扩展,UIPageViewController用于启用和禁用滑动。

extension UIPageViewController {

    func enableSwipeGesture() {
        for view in self.view.subviews {
            if let subView = view as? UIScrollView {
                subView.isScrollEnabled = true
            }
        }
    }

    func disableSwipeGesture() {
        for view in self.view.subviews {
            if let subView = view as? UIScrollView {
                subView.isScrollEnabled = false
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Szy*_*n W 5

@lee回答的快捷方式

extension UIPageViewController {
    var isPagingEnabled: Bool {
        get {
            return scrollView?.isScrollEnabled ?? false
        }
        set {
            scrollView?.isScrollEnabled = newValue
        }
    }

    var scrollView: UIScrollView? {
        return view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView
    }
}
Run Code Online (Sandbox Code Playgroud)