代码之家  ›  专栏  ›  技术社区  ›  euphoria83

uiExtView的uiGestureRecognizer阻止键盘在点击时出现

  •  0
  • euphoria83  · 技术社区  · 6 年前

    我有一个uitextview,我在其中附加了一个手势识别器,如下所示:

    let testTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(textTextViewTapped(gestureRecognizer:)))
    testTapGestureRecognizer.cancelsTouchesInView = false
    testTapGestureRecognizer.delaysTouchesBegan = false
    testTapGestureRecognizer.delaysTouchesEnded = false
    if textTextView != nil {
        textTextView!.addGestureRecognizer(testTapGestureRecognizer)
    }
    

    上面提到的选择器如下:

    @objc func textTextViewTapped(gestureRecognizer: UIGestureRecognizer) {
        print("testTextViewTapped called.")
    }
    

    每次我点击uitextview,我都能看到上面的信息打印在控制台上。但是,键盘不再出现。

    我发现苹果的医生很困惑: Here 它说

    手势识别器不参与视图响应器 链。

    我将其解释为任何手势也会发送到视图和链上,这是正常的。

    在同一页后面,它说,

    如果手势识别器识别出它的手势,则剩余的触摸 因为视图被取消。

    这意味着,如果附加的手势识别器能够将某个手势理解为它应该识别的手势,那么它将阻止该手势传递到它所附加的视图。此外,它还指定了3个属性,这些属性应该能够阻止手势识别器执行此操作。在我的代码中,我将它们全部设置为false,如上面所示。

    这里实际发生了什么?我如何允许uitextView正常解释触摸,以及如何使用手势识别器?

    2 回复  |  直到 6 年前
        1
  •  1
  •   André Slotta    6 年前

    你可以用 UIGestureRecognizerDelegate 使 UITapGestureRecognizer 按常规工作 UITextView 行为:

    class TestViewController: UIViewController {
    
        @IBOutlet weak var textView: UITextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
            tapGestureRecognizer.delegate = self
    
            textView.addGestureRecognizer(tapGestureRecognizer)
        }
    
        @objc private func tap() {
            print("tap")
        }
    
    }
    
    extension TestViewController: UIGestureRecognizerDelegate {
    
        func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
            return true
        }
    
    }
    
        2
  •  1
  •   dunkmann00    6 年前

    当用户点击时,uitextview可能有自己的专用手势识别器来处理。当发生这种情况时,它使文本视图成为第一响应者,从而导致键盘出现。手势识别器可以强制其他手势识别器在识别其手势时失败。(见 docs )也许这就是你添加点击手势时发生的事情。它可以识别tap,从而强制其他手势失败,从而阻止文本视图成为第一响应者。

    最好的解决办法是遵循这个答案 question (正如@francescodeliro在注释中提到的)并使用委托调用来了解编辑何时开始/结束。