如何检测对 UITableView 的触摸,到目前为止似乎没有任何效果?

Posted

技术标签:

【中文标题】如何检测对 UITableView 的触摸,到目前为止似乎没有任何效果?【英文标题】:How to detect touches on UITableView, nothing seems to work so far? 【发布时间】:2015-03-08 00:26:36 【问题描述】:

如何检测UITableView 上的触摸?我尝试了thread 中的解决方案。我的tableViewscrollView 在同一个UIViewController 中有一个约束,因此将tableView 子类化很复杂。 不调用 touches 方法:

class ViewController: UIViewController, UIScrollViewDelegate, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet weak var verticalSpacing: NSLayoutConstraint!
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var tableView: UITableView!


override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
    super.touchesBegan(touches, withEvent: event)
    println("touch began")

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) 
    super.touchesMoved(touches, withEvent: event)

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) 
    super.touchesEnded(touches, withEvent: event)
    println("touch ended")

override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) 
    super.touchesCancelled(touches, withEvent: event)

我补充说:

tableView.userInteractionEnabled = true
tableView.canCancelContentTouches = false //or true is the same

但它不会改变任何东西。 scrollViewtableView 同时可见,但它们不重叠。

【问题讨论】:

【参考方案1】:

不需要子类化!

只需添加一个手势识别器并确保包含对cancelsTouchesInView的调用

这是 Swift 版本:

override func viewDidLoad() 
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))


func handleTap(sender: UITapGestureRecognizer) 
    if sender.state == .Ended 
        // Do your thang here!
    
    sender.cancelsTouchesInView = false

享受吧!

【讨论】:

【参考方案2】:

在使用 UITableView 时,有一些方法可以用来检测滚动视图的变化。这些可能对你有用。

例如,

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) 
    println("Ended decelerating")


override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) 
    println("Ended dragging")

【讨论】:

谢谢,我会用 willBeginDragging 和 DidEndDragging,谢谢回答【参考方案3】:

您的问题是,touchesBegan 等也是来自 UIView 的方法,因此您需要继承 UITableView 或使用 TapGestureRecognizer 使其像您需要的那样工作。

子类化UITableView 应该不会太复杂,因为您可以在 Storyboard 中将 UITableView 类设置为 tableView 的类,就像使用 UIViewControllers 等一样。

【讨论】:

【参考方案4】:

您是否尝试调整delaysContentTouches?如果您按下足够长的时间,您的触摸可能会以默认延迟注册。

不得不问,你有什么理由不能只使用didSelectRowAtIndexPath

【讨论】:

谢谢,我会继续使用 willBeginDragging 和 DidEndDragging ,它们似乎有效。当用户停止拖动时,我必须检查滚动并取消它。感谢您的回答【参考方案5】:

派对迟到了,但我需要检测到桌面上的触摸而不是轻敲,所以我总结了这个:

fileprivate class TouchSensitiveTableView: UITableView 

    fileprivate var onTouchStart: (() -> ())? = nil
    fileprivate var onTouchEnd: (() -> ())? = nil

    public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        self.onTouchStart?()
    

    public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
        self.onTouchEnd?()
    

然后这样使用

private let tableView = TouchSensitiveTableView()

viewDidLoad() 
    ....
    self.tableView.onTouchStart = [weak self] in .... 
    self.tableView.onTouchEnd = [weak self] in .... 

与表格的滚动有一个次要的交互,但不是主要的。

【讨论】:

好吧,UITableView 中的点击停止了这个解决方案......

以上是关于如何检测对 UITableView 的触摸,到目前为止似乎没有任何效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元格下方的表格视图中检测点击/触摸?

iPhone - 检测对 UITableViewCell 子视图的触摸

检测 UITableView 的超级视图中的触摸,如果反弹不是 = 否,它会反弹

如何使用多个部分检测UITableViewCell的UIView上的触摸?

如何检测 UI 图像上的触摸?

UIGestureRecognizer 处理 UITableView 中的触摸