菜鸟教程小白 发表于 2022-12-11 17:44:17

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


                                            <p><p>我正在使用 uiPageViewController(底部的图像)编写一系列设置/设置屏幕。用户配置东西,然后滑动到下一个屏幕,依此类推。但我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置。 </p>

<p>我试过了:</p>

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

<p>2)</p>

<pre><code>func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -&gt; UIViewController? {
    if !forwardSwipeEnabled {
      return nil
    }
    var index= contentViewControllers.indexOf(viewController)
    index += 1
    return contentViewControllers
}
</code></pre>

<p>到 <code>return nil</code> 当 <code>forwardSwipeEnabled</code> 设置为 <code>false</code> 时,它可以工作,但是即使在我更改 forwardSwipeEnabled = 后,向前滑动仍然被阻止true 因为当场景出现在屏幕上时 UIPageViewController 已经调用了这个函数。 </p>

<p>如果我再次来回前进,则再次调用该函数并且它可以工作。 </p>

<p><strong>-- 编辑 -----</strong></p>

<p>使用当前 ViewController 调用 <code>pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)</code> 不会刷新或再次调用该函数。</p>

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

<p><strong>-- 编辑 -----</strong></p>

<p>4) 我可以使用 <code>view.subviews.first?.gestureRecognizers</code> 获得手势识别器,但设置它们 <code>gestureRecognize.enabled = false</code> 会阻止正向和反向。每个人都没有不同的手势识别器可以选择性地阻止。</p>

<p>5) 在方向为正向或让它运行时拦截手势并吃掉它,反向时底部代码不起作用,因为用户可以开始向后滑动,触发函数返回并向前完成。</p >

<pre><code>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) -&gt; 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 &lt; 0 {
            return true
      }
      if velocity.x &lt; 0 {
            return true
      }
      return false
    }
    return false
}
</code></pre>

<hr/>

<p>示例屏幕:</p>

<p> <a href="/image/RD2xqm.png" rel="noreferrer noopener nofollow"><img src="/image/RD2xqm.png" alt="example"/></a> <a href="/image/o1BGWm.png" rel="noreferrer noopener nofollow"><img src="/image/o1BGWm.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>作为一个建议,您可以在完成工作后使用 <code>setViewControllers:direction:animated:completion</code> 重新加载数据源。这应该可以修复您的下一页。
它的 obj-c 代码。它应该在 swift 中具有相同的代码。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 仅在 uiPageViewController 中禁用临时向前滑动,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39858455/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39858455/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 仅在 uiPageViewController 中禁用临时向前滑动