我正在使用uiPageViewController(底部的图像)编写一系列设置/设置屏幕。用户配置内容,然后滑动到下一个屏幕,依此类推。但我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置。
我试过了:
1)uiPageViewController.view.userInteractionEnabled = false。它会阻止屏幕中的所有内容,包括向后滑动。我想只阻止前锋。
2)
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if !forwardSwipeEnabled {
return nil
}
var index = contentViewControllers.indexOf(viewController)
index += 1
return contentViewControllers[index]
}
当return nil
被设置为forwardSwipeEnabled
时,false
可以工作,但是即使在我改变forwardSwipeEnabled = true之后前向滑动仍然被阻止,因为当场景出现在屏幕上时UIPageViewController已经调用了这个函数。
如果我再次前进和后退,则会再次调用该函数并且它可以正常工作。
-----编辑-----
使用当前视图控制器调用pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)
不会刷新或再次调用该函数。
3)仅在用户完成后附加下一个屏幕(UIViewcontroller),但出现与2)相同的问题。
-----编辑-----
4)我可以用view.subviews.first?.gestureRecognizers
获取gestureRecognizers,但设置它们gestureRecognize.enabled = false
阻止正向和反向。每个人都没有选择性阻止不同的gestureRecognizer。
5)当方向前进或让它运行时截取手势并吃掉它,当向后移动时底部代码不起作用,因为用户可以开始向后滑动,触发功能返回并完成前进。
override func viewDidLoad() {
super.viewDidLoad()
for view: UIView in pageViewController!.view.subviews {
if (view is UIScrollView) {
let scrollView = (view as! UIScrollView)
self.scrollViewPanGestureRecognzier = UIPanGestureRecognizer()
self.scrollViewPanGestureRecognzier.delegate = self
scrollView.addGestureRecognizer(scrollViewPanGestureRecognzier)
}
}
}
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == scrollViewPanGestureRecognzier {
guard let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer else { return false }
let velocity = panGestureRecognizer.velocityInView(view)
let translation = panGestureRecognizer.translationInView(view)
if translation.x < 0 {
return true
}
if velocity.x < 0 {
return true
}
return false
}
return false
}
示例屏幕:
作为一个建议,你可以在工作完成后用setViewControllers:direction:animated:completion
重新加载数据源。这应该会修复你的下一页。它的对象代码。它应该在swift中具有相同的代码。
使用UIPageViewController的gestureRecognizers
属性。它是一组手势识别器。循环通过手势识别器将每个人的isEnabled
设置为false
。准备好后,再次使用true
。
更简单,只需将UIPageViewController的view
的isUserInteractionEnabled
设置为false
然后再设置true
。
你找到这些年的解决方案了吗?我发现只有一个:如果禁止前锋立即回去:
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
let pageContentViewController = pageViewController.viewControllers![0]
let currentPage = orderedViewControllers!.index(of: pageContentViewController)!
if !nextButton.isEnabled && currentPage > pageControl.currentPage {
DispatchQueue.main.asyncAfter(deadline: .now()+0.05, execute: {
self.setViewControllers([self.orderedViewControllers![self.pageControl.currentPage]], direction: .reverse, animated: false, completion: nil)
})
}
}