0

我有一个UICollectionView,我可以使用UISearchBar. 我进行了设置,以便当用户点击屏幕上的任意位置时,键盘会被关闭。

viewDidLoad()

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.dismissKeyboard))
view.addGestureRecognizer(tap)

然后:

@objc override func dismissKeyboard() {
    view.endEditing(true)
    searchBar.endEditing(true)
}

它可以关闭键盘,但这个轻击手势识别器妨碍了选择 UICollectionView 单元格。didSelectItemAt方法就是行不通。

在这里查看另一个答案,我设法通过删除手势识别器并仅添加dismissKeyboard(). didSelectItemAt但是,现在它只有在您点击单元格时才会关闭,然后选择项目(我不想要,我只想让键盘关闭)。

如何做到这一点,以便在显示键盘时点击屏幕上的任意位置将其关闭,之后UICollectionView单元格可以工作并且可以选择?

谢谢!

4

4 回答 4

2

您需要在视图控制器中扩展 UIGestureRecognizerDelegate 并添加此代码片段。然后点击手势将不适用于 collectionview 并在其余视图中正常运行。

 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {

    if touch.view != self.yourCollectionView{
        return false
    }else{
        return true
    }

}
于 2019-09-03T19:07:28.963 回答
0

在 didSelectItemAt 你可以检查,你的 UISearchBar 是第一响应者。

if searchBar.isFirstResponder {
    searchBar.endEditing(true)
} else {
    //do what You want
}

如果您有其他东西,除了单元格,添加您的手势识别器以关闭键盘

于 2019-09-03T18:43:03.860 回答
0

最后通过在所有内容之上添加一个透明视图并将手势识别器应用于它来修复它。在viewDidLoad()我将视图设置为isHidden = true.

然后添加了这些:

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
        gestureView.isHidden = false

        return true
    }

    func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
        gestureView.isHidden = true

        return true
    }
于 2019-09-03T19:38:30.597 回答
0

也许尝试tapGesture.cancelsTouchesInView = false

override func viewWillAppear(_ animated: Bool) {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
    tapGesture.cancelsTouchesInView = false
    view.addGestureRecognizer(tapGesture)
}
    
@objc func hideKeyboard() {
    searchController.searchBar.resignFirstResponder()
    view.endEditing(true)
}
于 2021-02-06T11:02:28.457 回答