Ios 仅在uiPageViewController中禁用临时向前滑动

Ios 仅在uiPageViewController中禁用临时向前滑动,ios,iphone,swift,installation,uipageviewcontroller,Ios,Iphone,Swift,Installation,Uipageviewcontroller,我正在使用uiPageViewController编写一系列设置/设置屏幕(底部的图像)。用户配置内容,然后滑动到下一个屏幕,等等。但是我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置 我试过: 1) uiPageViewController.view.userInteractionEnabled=false。它会阻止屏幕上的所有内容,包括向后滑动。我只想阻挡前锋 (二) 当forwardswipenabled设置为false时,返回nil,它可以工作,但即使在我更改forwardsw

我正在使用uiPageViewController编写一系列设置/设置屏幕(底部的图像)。用户配置内容,然后滑动到下一个屏幕,等等。但是我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置

我试过:

1) uiPageViewController.view.userInteractionEnabled=false。它会阻止屏幕上的所有内容,包括向后滑动。我只想阻挡前锋

(二)

forwardswipenabled
设置为
false
时,返回nil,它可以工作,但即使在我更改forwardswipenabled=true后,前向滑动仍然被阻止,因为当场景显示在屏幕上时UIPageViewController已经调用了此函数

如果我再次前后移动,函数会再次被调用,并且它会工作

----编辑---

正在调用
pageViewController!。setViewControllers(viewControllers,direction:.Forward,animated:false,completion:nil)
使用当前视图控制器时,不会刷新或再次调用该函数

3) 仅在用户完成后附加下一个屏幕(UIViewcontroller),但会出现与2)相同的问题

----编辑---

4) 我可以使用
view.subviews.first?.gestureRecognitivers
获取gestureRecognitivers,但是设置它们
gestureRecognition.enabled=false
会阻止前进和后退。没有不同的手势识别器,每个手势识别器都可以选择性地进行阻止

5) 当方向向前时截取手势并吃掉它,或者让它运行,当向后时底部代码不起作用,因为用户可以开始向后滑动,触发函数return并完成forward

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
}
override func viewDidLoad(){
super.viewDidLoad()
视图:在pageViewController!.view.subview中查看UIView{
如果(视图为UIScrollView){
让scrollView=(视图为!UIScrollView)
self.scrollViewPanGestureRecognzier=UIPangestureRecognzier()
self.scrollViewPanGestureRecognzier.delegate=self
scrollView.addGestureRecognizer(ScrollViewPangestureRecognizer)
}
}
}
func GestureRecognitzer应开始(GestureRecognitzer:UIGestureRecognitzer)->Bool{
如果手势识别器==ScrollViewPangTestureRecognzier{
guard let panGestureRecognizer=gestureRecognizer as?UIPanGestureRecognizer else{return false}
让velocity=PangestureRecognitor.velocityInView(视图)
let translation=pangestrerecognizer.translationView(视图)
如果平移.x<0{
返回真值
}
如果速度.x<0{
返回真值
}
返回错误
}
返回错误
}

示例屏幕:


作为建议,您可以在工作完成后使用
setViewControllers:direction:animated:completion
重新加载数据源。这将修复您的下一页。
它的obj-c代码。在swift中应该有相同的代码。

这些年你找到解决方案了吗? 我只找到一个:如果禁止前进,请立即后退:

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

不幸的是,这不起作用。不再调用“viewControllerAfterViewController”函数:-(“但我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置。”您的基本策略是正确的。
viewControllerAfterViewController
delegate方法只需返回
nil
即可防止向前滑动。@matt,如2所述),它会阻止,但在我更改了告诉它阻塞的环境变量后,不会取消阻塞。我无法刷新框架,因此它再次调用该函数以解除阻止。它仍然会被卡住,除非用户返回到上一个页面并再次转发到被锁定的页面。对,这一定是因为运行时对自己说,嘿,我已经知道这个视图控制器的答案,所以我无需再次调用此方法。但这就是@kocakmstf的建议有意义的原因。您需要替换另一个视图控制器,即您自己,提供同一视图控制器的新实例,以便再次调用委托方法。我已经做到了。该函数不会再次被调用:-(
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)
        })
    }
}