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

问题描述 投票:2回答:3

我正在使用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
}

示例屏幕:

example enter image description here

ios iphone swift installation uipageviewcontroller
3个回答
0
投票

作为一个建议,你可以在工作完成后用setViewControllers:direction:animated:completion重新加载数据源。这应该会修复你的下一页。它的对象代码。它应该在swift中具有相同的代码。


0
投票

使用UIPageViewController的gestureRecognizers属性。它是一组手势识别器。循环通过手势识别器将每个人的isEnabled设置为false。准备好后,再次使用true

更简单,只需将UIPageViewController的viewisUserInteractionEnabled设置为false然后再设置true


0
投票

你找到这些年的解决方案了吗?我发现只有一个:如果禁止前锋立即回去:

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)
        })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.