如何检测UITableView
上的触摸?我尝试了thread中的解决方案。我的tableView
和scrollView
在同一个UIViewController
中有约束,因此将tableView
子类化很复杂。
触摸方法不会被调用:
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
同时可见,但它们不重叠。
答案 0 :(得分:9)
不需要子类化!
只需添加一个手势识别器,并确保包含对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
}
享受!
答案 1 :(得分:2)
使用UITableView检测滚动视图的更改时,有一些方法非常有用。这些可能对你有用。
例如,
override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
println("Ended decelerating")
}
override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
println("Ended dragging")
}
答案 2 :(得分:1)
您的问题是,touchesBegan
等也是来自UIView
的方法,因此您需要子类化UITableView
或使用TapGestureRecognizer使其按您需要的方式工作。< / p>
将UITableView
子类化为不应该太复杂,因为您可以将UITableView类设置为Storyboard中tableView的类,就像使用UIViewControllers等一样。
答案 3 :(得分:0)
您是否尝试调整delaysContentTouches
?可能是如果你按下足够长的时间,你的触摸会以默认延迟注册。
不得不问,是否有理由不能只使用didSelectRowAtIndexPath
?
答案 4 :(得分:0)
迟到聚会了,但是我需要检测桌子上的触摸 不轻按 ,所以我对此感到很沮丧:
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 .... }
与表格的滚动有较小的交互作用,但不是主要的。