如何为 UITableViewCell 的子视图禁用 UITapGesture?

Posted

技术标签:

【中文标题】如何为 UITableViewCell 的子视图禁用 UITapGesture?【英文标题】:How to disable UITapGesture for a subView of UITableViewCell? 【发布时间】:2020-06-11 08:16:55 【问题描述】:

我有一个带有两个不同自定义 UITableViewCells 的 tableView。 tableView 中的第一个单元格始终为 ResearchPostFeedTableViewCell 类型,其余为 CommentTableViewCell 类型。第一个单元格类型包含一个子视图,当点击它时我希望它做一些事情。我的问题是,我在 UIViewController.view 中添加了一个 UITapGestureRecognizer 来隐藏键盘。因此,点击屏幕上的任意位置只会隐藏键盘。当用户点击第一个单元格的子视图时,如何专门禁用此点击手势?我尝试了以下方法,但我怀疑我没有完全正确的代码来定位第一个单元格的子视图上的触摸以禁用 UIViewController.view tapGesture。

class CommentMainViewController: UIViewController, UITextViewDelegate, UIGestureRecognizerDelegate

    var myTableView: CommentOnPostTableView! // Custom UITableView
    var screenTapGesture: UITapGestureRecognizer!

    override func viewDidLoad() 
        super.viewDidLoad()

    ...
    screenTapGesture = UITapGestureRecognizer.init(target: self, action: #selector(hideKeyBaord))
    screenTapGesture.delegate = self
    self.view.addGestureRecognizer(screenTapGesture)
    ...




    func hideKeyBaord()
        // Hides the keyboard
    


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

    if gestureRecognizer == screenTapGesture
        let researchCell = myTableView.cellForRow(at: [0,0]) // First cell only
        if let imageCarousel = researchCell?.imageView
            let location = touch.location(in: imageCarousel)
            let isTouchImage = imageCarousel.frame.contains(location)
            if isTouchImage
                print("IMAGE TOUCHED!")
                // Disable screenTapGesture
                return false
            else
                return true
            
        
            return true
        else
            return false
        
    

【问题讨论】:

【参考方案1】:

我认为您的问题是隐藏键盘的点击手势取消了其他触摸。

只需将点击手势的 cancelsTouchesInView 属性设置为 false,如下所示:

screenTapGesture.cancelsTouchesInView = false

【讨论】:

超优雅的单眼线解决方案。谢谢!

以上是关于如何为 UITableViewCell 的子视图禁用 UITapGesture?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode:如何为使用 Storyboard 创建的子视图设置委托?

iPhone/iOS:如何为 Scrollview 的子视图实现拖放?

如何为嵌入在 UITableViewCell 中的 UIView 设置动画

如何为堆栈视图中的视图添加约束

如何为 UITableViewCell 设置动画

如何为单元格设置双边框