如何禁用UIPageViewController的轻扫手势?

在我的情况下,父UIViewController包含UIPageViewController ,其中包含UINavigationController其中包含UIViewController 。 我想添加一个滑动手势到最后一个视图控制器,但滑动处理,如果他们属于页面视图控制器。 我试图以编程方式和通过xib,但没有结果。

所以据我所知,我不能达到我的目标,直到UIPageViewController处理其手势。 如何解决这个问题?

7 Solutions collect form web for “如何禁用UIPageViewController的轻扫手势?”

防止UIPageViewController滚动的文档化方式是不分配dataSource属性。 如果您分配数据源,则会转到“手势”导航模式,这是您要阻止的。

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

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

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

 for (UIScrollView *view in self.pageViewController.view.subviews) { if ([view isKindOfClass:[UIScrollView class]]) { view.scrollEnabled = NO; } } 

我把user2159978的答案翻译成Swift

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

编辑 :这个答案只适用于页面curl风格。 Jessedc的答案好得多:无论风格如何,都依赖于logging的行为

UIPageViewController公开了它的数组手势识别器,你可以用它来禁用它们:

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

我一直在争取这一段时间,并认为我应该张贴我的解决scheme,继续从Jessedc的答案; 删除PageViewController的数据源。

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

 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 } } 

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

 override func viewDidAppear(animated: Bool) { PgeViewController.enable(false) } 

我希望这可以帮助别人,而不是像我喜欢的那样干净,但不会觉得太尴尬等等。

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

如果您希望您的UIPageViewController保持其滑动的能力,同时允许您的内容控件使用其function(滑动删除等),只需closurescanCancelContentTouches中的UIPageViewController

把它放在你的UIPageViewControllerviewDidLoad函数中。 (迅速)

 if let myView = view?.subviews.first as? UIScrollView { myView.canCancelContentTouches = false } 

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

从…

在一个pageViewController内部的tableView上滑动即可删除

作为扩展实现@ lee's(@ user2159978's)解决scheme:

 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 } } } } } 

用法:(在UIPageViewController

 isPagingEnabled = false 
  • iPhone - 如何find最顶层的视图控制器
  • CAGradientLayer,不好调整,撕裂旋转
  • iOS - 从ViewController调用App Delegate方法
  • 如何以编程方式在UINavigationController中按“返回”button
  • 从UIView获取UIViewController?
  • 为什么我不能在Swift中的UIViewController上调用默认的super.init()?
  • xcode storyboard容器视图 - 如何访问视图控制器
  • 在UIViewController的视图内的iOS嵌套视图控制器视图?
  • 使用UIViewControllerInteractiveTransitioning实现自定义UIViewController交互转换的正确方法委托协议
  • iPhone如何检查一个对象的types?
  • 如何使用单个故事板uiviewcontroller多个子类