如何禁用UIPageViewController的轻扫手势?
在我的情况下,父UIViewController
包含UIPageViewController
,其中包含UINavigationController
其中包含UIViewController
。 我想添加一个滑动手势到最后一个视图控制器,但滑动处理,如果他们属于页面视图控制器。 我试图以编程方式和通过xib,但没有结果。
所以据我所知,我不能达到我的目标,直到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类(链接到故事板中的页面视图控制器,inheritanceUIPageViewController
和UIPageViewControllerDataSource
):
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
。
把它放在你的UIPageViewController
的viewDidLoad
函数中。 (迅速)
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