我无法解决这个问题。
我的UIView
大UITapGestureRecognizer
。
在这个视图中我放了(较小的)UITableView
。而现在,如果我轻拍细胞,
未调用didSelectRowAt
,因为UIView
点击识别器会检测到点按。 (它的方法被称为。)
我如何解决这个问题,UITableView
没有通过触摸到视图。
我尝试设置
table.isUserInteractionEnabled = true
和
table.isExclusiveTouch = true
但它没有帮助
你的很多答案都表明我在下面有一个tableView视图,但事实并非如此。
我会粘贴一些代码(为方便起见改了一下):
class Panel: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setTapGesture()
}
func setTapGesture() {
tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(UIControlCenterPanel.tapOnPanel(recogniser:)))
self.addGestureRecognizer(tapGesture)
}
func tapOnPanel(recogniser : UITapGestureRecognizer) {
print("Tap was made")
}
}
class MyPanel: Panel, UITableViewDelegate {
let table = MyTable()
override init(frame: CGRect) {
super.init(frame: frame)
table.table.delegate = self
table.isUserInteractionEnabled = true // This was added as a test
table.table.isExclusiveTouch = true // This was added as a test
table.translatesAutoresizingMaskIntoConstraints = false
addSubview(table)
.... // constraints added below
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("cell tapped")
}
}
class MyTable: UIView {
let table = UITableView()
override init(frame: CGRect) {
super.init(frame: frame)
table.translatesAutoresizingMaskIntoConstraints = false
addSubview(table)
}
}
如果我现在点击单元格,则会打印:
Tap was made
如果我将这样的手势识别器注释掉:
func setTapGesture() {
// tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(UIControlCenterPanel.tapOnPanel(recogniser:)))
// self.addGestureRecognizer(tapGesture)
}
然后打印出来:
cell tapped
答案 0 :(得分:1)
您可以覆盖容器UIView的hitTest
方法,只让子视图(如果有)接收触摸事件,但从不接受。这允许搜索继续下面的无关视图。只需将UIView替换为此类的实例:
class PassThroughView: UIView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let result = super.hitTest(point, with: event)
return result == self ? nil : result
}
}
答案 1 :(得分:0)
在BOOL
中返回适当的gestureRecognizer:shouldReceiveTouch:
值可让您将触摸传播到所需的子视图。
实现此目的的一些示例代码可以是:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if([touch.view isDescendantOfView:table]){
return NO; // or YES, as desired
}
}
ViewController.m
@property
,也可以通过viewWithTag:
提取答案 2 :(得分:0)
让tap = UITapGestureRecognizer(目标:自我,行动: 选择器(“handleTap:”))tap.delegate = self tap.cancelsTouchesInView = 假 view.addGestureRecognizer(点击)//默认视图
func handleTap(sender:UITapGestureRecognizer?= nil){ view.endEditing(true)// keyboars hides}
答案 3 :(得分:0)
试试此代码
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if touch.view.isDescendantOf(yourTableView) {
return false
}
return true
}
答案 4 :(得分:0)
您可以参考问题中所述的答案。
链接:UITapGestureRecognizer breaks UITableView didSelectRowAtIndexPath
根据触摸视图的类型设置委托以过滤有效触摸是最佳解决方案。一些答案建议使用cancelsTouchesInView = false来解决这个问题,但它实际上同时触发了UITableView didSelectRowAt和UITapGestureRecognizer选择器。为自己选择合适的。