首页 > 解决方案 > 容器视图的 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)
    }

标签: iosswiftuicollectionviewuigesturerecognizeruitapgesturerecognizer

解决方案


在 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
}
}

尝试并分享结果。


推荐阅读