iOS: 单击 TableCellView 内的视图
iOS: clicking on a view inside a TableCellView
我在 UITableViewCell
里面放了一个小 UIView
。
- 如果点击 这样的
UIView
,我想打开一个弹出窗口。
- 在外部这样的
UIView
窃听的情况下,我想执行它在UITableView
“didSelectRowAtIndexPath中定义的内容”函数。
目前正在发生的事情是,当我单击 on 视图时,两件事都会发生:弹出窗口打开并且“didSelectRowAtIndexPath”函数被触发。
如何确保当我点击 UIView
时,“didSelectRowAtIndexPath”函数不会被触发?
当前实施:
我在自定义 UITableViewCell
class.
中为 UIView
定义了一个 UITapGestureRecognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MyCustomTableViewCell.clickOnHelp(_:)))
myClickAreaUIView.addGestureRecognizer(tapGesture)
尝试将内部视图的 exclusiveTouch 属性 设置为 true
。
cell.tapView.exclusiveTouch = true
只需在 cellForRowAtIndexPath() 中编写这段代码,因为 select prevent::
cell.selectionStyle = UITableViewCellSelectionStyle.None
我建议像下面那样实现 UIGestureRecognizerDelegate
的以下方法
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
print("in shouldReceiveTouch")
gestureRecognizer.delegate = self
if ([...]){ // touch location is in the UIView
print("touching UIView")
return false // prevent from forwarding touch to superview
} else {
println("touching elsewhere")
return true
}
}
您应该使用 UIGestureRecognizerDelegate
中的此方法
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return false
}
为您的 UIView
创建一个 customClass 让我们说 CustomView
类型 UIView
连接您的 UIView
的 @IBOutlet
符合类型 CustomView
的 tableViewCell
在CustomViewclass中调用这个函数
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
super.pointInside(point, withEvent: event)
return CGRectContainsPoint(self.bounds, point)
}
这将告诉您用户点击的位置是否包含在 UIView
范围内,如果 returns true在你的 UIGestureRecognizer
函数中弹出并跟随 ,如果 false 则相反
我建议的最佳解决方案是将 UIView
更改为 UIButton
并使用按钮上的 touchUpInside
处理触摸。
这样您将到达您的 objective,因为 UIButton
自动阻止触摸事件转发到 superview
我在 UITableViewCell
里面放了一个小 UIView
。
- 如果点击 这样的
UIView
,我想打开一个弹出窗口。 - 在外部这样的
UIView
窃听的情况下,我想执行它在UITableView
“didSelectRowAtIndexPath中定义的内容”函数。
目前正在发生的事情是,当我单击 on 视图时,两件事都会发生:弹出窗口打开并且“didSelectRowAtIndexPath”函数被触发。
如何确保当我点击 UIView
时,“didSelectRowAtIndexPath”函数不会被触发?
当前实施:
我在自定义 UITableViewCell
class.
UIView
定义了一个 UITapGestureRecognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MyCustomTableViewCell.clickOnHelp(_:)))
myClickAreaUIView.addGestureRecognizer(tapGesture)
尝试将内部视图的 exclusiveTouch 属性 设置为 true
。
cell.tapView.exclusiveTouch = true
只需在 cellForRowAtIndexPath() 中编写这段代码,因为 select prevent::
cell.selectionStyle = UITableViewCellSelectionStyle.None
我建议像下面那样实现 UIGestureRecognizerDelegate
的以下方法
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
print("in shouldReceiveTouch")
gestureRecognizer.delegate = self
if ([...]){ // touch location is in the UIView
print("touching UIView")
return false // prevent from forwarding touch to superview
} else {
println("touching elsewhere")
return true
}
}
您应该使用 UIGestureRecognizerDelegate
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return false
}
为您的 UIView
创建一个 customClass 让我们说 CustomView
类型 UIView
连接您的 UIView
的 @IBOutlet
符合类型 CustomView
在CustomViewclass中调用这个函数
override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
super.pointInside(point, withEvent: event)
return CGRectContainsPoint(self.bounds, point)
}
这将告诉您用户点击的位置是否包含在 UIView
范围内,如果 returns true在你的 UIGestureRecognizer
函数中弹出并跟随 ,如果 false 则相反
我建议的最佳解决方案是将 UIView
更改为 UIButton
并使用按钮上的 touchUpInside
处理触摸。
这样您将到达您的 objective,因为 UIButton
自动阻止触摸事件转发到 superview