如何检测对 UITableView 的触摸,到目前为止似乎没有任何效果?
Posted
技术标签:
【中文标题】如何检测对 UITableView 的触摸,到目前为止似乎没有任何效果?【英文标题】:How to detect touches on UITableView, nothing seems to work so far? 【发布时间】:2015-03-08 00:26:36 【问题描述】:如何检测UITableView
上的触摸?我尝试了thread 中的解决方案。我的tableView
和scrollView
在同一个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
但它不会改变任何东西。 scrollView
与 tableView
同时可见,但它们不重叠。
【问题讨论】:
【参考方案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 的超级视图中的触摸,如果反弹不是 = 否,它会反弹