ios - 容器视图的 collectionVC 被父级的 tapGesture 识别器阻止
问题描述
如果用户点击屏幕,我有一个 UIViewController 的扩展,如下所示关闭键盘。在这个视图中,我有一个包含文本字段和两个容器视图的滚动条。容器视图包含一个 collectionView。我希望我的整体 viewController 在被点击时关闭,但我仍然希望我的 collectionView 的 didSelectitemAtIndexPath 触发。我怎样才能做到这一点?
public extension UIViewController {
public func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
}
public func dismissKeyboard() {
view.endEditing(true)
}
}
和
class RegisterVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
logViewLoad()
self.hideKeyboardWhenTappedAround()
let controller = self.storyboard?.instantiateViewController(withIdentifier: "CollectionViewSearchVC") as! CollectionViewSearchVC
controller.type = "SC"
addChildViewController(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
controller.delegate = self
containerView.addSubview(controller.view)
NSLayoutConstraint.activate([
controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
controller.view.topAnchor.constraint(equalTo: containerView.topAnchor),
controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
])
controller.didMove(toParentViewController: self)
subContractorVC = controller
let employeeController = self.storyboard?.instantiateViewController(withIdentifier: "CollectionViewSearchVC") as! CollectionViewSearchVC
employeeController.type = "V"
employeeController.delegate = self
addChildViewController(employeeController)
employeeController.view.translatesAutoresizingMaskIntoConstraints = false
employeeContainerView.addSubview(employeeController.view)
NSLayoutConstraint.activate([
employeeController.view.leadingAnchor.constraint(equalTo: employeeContainerView.leadingAnchor),
employeeController.view.trailingAnchor.constraint(equalTo: employeeContainerView.trailingAnchor),
employeeController.view.topAnchor.constraint(equalTo: employeeContainerView.topAnchor),
employeeController.view.bottomAnchor.constraint(equalTo: employeeContainerView.bottomAnchor)
])
employeeController.didMove(toParentViewController: self)
}
解决方案
在 ViewController 中实现 GestureRecogniser 的委托方法并检查被触摸的类,如果是 UICollectionView 类,则忽略该触摸并让它执行默认行为,即 didSelect 否则允许点击。
class ParentViewController: UIViewController {
var tap: UITapGestureRecognizer?
override func viewDidLoad() {
super.viewDidLoad()
tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap!)
}
public func hideKeyboardWhenTappedAround() {
dismissKeyboard()
}
@objc public func dismissKeyboard() {
view.endEditing(true)
}
}
class RegisterVC: ParentViewController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
tap?.delegate = self
// YOUR EXISTING CODE HERE
}
// NEW CODE ADDED HERE
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
print("shouldReceive")
print(gestureRecognizer.view as Any) // CHECK FOR WHICH CLASS YOU ARE GETTING HERE WHEN YOU CLICK ON COLLECTIONVIEW
if (gestureRecognizer.view?.isKind(of: UICollectionView.self))! {
return false
}
return true
}
}
尝试并分享结果。
推荐阅读
- javascript - 有人可以解释 Javascript 经典模块模式以及我们为什么要使用它吗?
- c# - 不支持实体框架核心 SQLite 连接字符串关键字:版本
- docker - 从 docker 创建 alpine linux iso - libburn 权限被拒绝
- mysql - 如何构建将利用多个数据源作为其模型的应用程序的数据库?
- javascript - 为什么方法 enumNodeFragments 未定义?
- sql - 如何根据可能更改的日期范围在表格中选择值
- java - 如何在android中构建通知并实现点击监听?
- python - 如何在 Django 的 Inventory 模型中添加多个项目
- php - Laravel 在哪里枢轴
- html - 需要在 SVG 中打勾