菜鸟教程小白 发表于 2022-12-11 18:36:30

ios - 如何禁用 UIScrollView 到平移手势识别器?


                                            <p><p>当平移手势识别器(我们称之为 <code>SomePanGestureRecognizer</code>)被调用时,如何禁用或强制使 <code>UIScrollView</code> 中的手势识别器失败?</p >

<p><code>gestureRecognizer(_:shouldBeRequiredToFailBy:)</code> 方法采用手势识别器参数,而不是平移手势识别器,我不知道这是我无法让它工作的原因还是因为我出现语法错误。</p>

<p>我有 <code>UIScrollView</code> 子类,用于强制失败的方法在下面的委托(delegate)中:</p>

<pre><code>class CustomScrollView: UIScrollView {

    override init(frame: CGRect) {
      super.init(frame: frame)

      configure()

    }

    required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)

      configure()

    }

    private func configure() {

      isScrollEnabled = true
      showsHorizontalScrollIndicator = false
      showsVerticalScrollIndicator = false
      isPagingEnabled = true
      bounces = false
      alwaysBounceVertical = false
      alwaysBounceHorizontal = false

    }

}

// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {   

    // allow simultaneous gestures
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {
      return true
    }

    // force failure
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {

      // TLDR: disable uiscrollview when SomePanGestureRecognizer is called

    }

}
</code></pre>

<p><br/>
这是需要强制 <code>UIScrollView</code> 中的手势识别器失败的平移手势识别器:</p>

<pre><code>func addSomePanGestureRecognizer() {
    SomePanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(oneBPanGestureHandler(gesture:)))
    oneBHandle.addGestureRecognizer(SomePanGestureRecognizer)
}
</code></pre>

<p><br/><br/>
<strong>更新</strong>我将 UIPanGestureRecognizer 子类化并使用同步委托(delegate)使其工作,但我担心这是一种不稳定的方法,因为我依赖 UIKit 在自定义平移手势之前始终禁用 UIScrollView .</p>

<pre><code>// gesture recognizer delegate
extension CustomScrollView: UIGestureRecognizerDelegate {

    // simultaneous gestures
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {

      if otherGestureRecognizer is CustomPanGestureRecognizer {
            return false
      } else {
            return true
      }

    }

}
</code></pre>

<p><br/>
<strong>UPDATE 2</strong> 这也有效,但我不知道为什么,因为我觉得它不应该。不应该反过来吗?</p>

<pre><code>// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {

    if otherGestureRecognizer is CustomPanGestureRecognizer {
      return true
    } else {
      return false
    }

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我相信这就是您要找的:</p>

<pre><code>func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {
   let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer &amp;&amp; otherGestureRecognizer is SomePanGestureRecognizer
   return !isPanAndOtherRecognizer
}

// force failure
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -&gt; Bool {

   let isPanAndOtherRecognizer = gestureRecognizer is UIPanGestureRecognizer &amp;&amp; otherGestureRecognizer is SomePanGestureRecognizer
   return isPanAndOtherRecognizer
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何禁用 UIScrollView 到平移手势识别器?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46008225/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46008225/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何禁用 UIScrollView 到平移手势识别器?