【问题标题】:Container view's collectionVC blocked with Parent's tapGesture recognizer容器视图集合 VC 被父的点击手势识别器阻止
【发布时间】:2018-07-16 13:12:56
【问题描述】:

我有一个 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)
    }

【问题讨论】:

    标签: ios swift uicollectionview uigesturerecognizer uitapgesturerecognizer


    【解决方案1】:

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

    尝试并分享结果。

    【讨论】:

    • 我把键盘关闭代码放在哪里了。我添加了您建议的委托方法。当我使用我现有的代码时,即 self.hideKeyboardWhenTappedAround(),键盘在触摸时被关闭,并且不会触发 collectionview didselect。当我离开那条线时。调用了 collectionview 委托,但没有发生键盘关闭
    • 在你的RegisterVC的viewDidLoad中,你可以添加self.hideKeyboardWhenTappedAround(),它已经存在了。所以,现在你应该检查的下一件事是 print("shouldReceive") print(gestureRecognizer.view as Any),你得到的视图,检查我的编辑。
    • 好的,根本没有打印出来。我需要明确地将 regvc 定义为手势委托。我该怎么做呢?请注意,我扩展 UIViewController 的原始函数是 UITapGestureRecognizer
    • 您可以创建一个父类并继承您的 RegisterVC 或任何其他需要点击以从 ParentViewController 隐藏功能的类,检查我的编辑
    • 谢谢我尝试了你的编辑。现在我正在从gestureRecognizer获取打印。我的 collectionView 是容器视图的一部分,所以当我选择它时,类型是 UIView。如何解决这个问题?
    【解决方案2】:

    您需要在子 VC 的视图后面创建一个视图并为其添加手势

    【讨论】:

    • 如何将此手势识别器添加到我的滚动视图中?
    • 您能否添加更多关于如何实施您的解决方案的信息?我的容器视图只是一个集合视图,它固定在其 VC 的顶部、左侧、右侧和底部
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多