如何为 UITableViewCell 的子视图禁用 UITapGesture?
How to disable UITapGesture for a subView of UITableViewCell?
我有一个带有两个不同自定义 UITableViewCell 的 tableView。 tableView 中的第一个单元格始终为 ResearchPostFeedTableViewCell 类型,其余单元格为 CommentTableViewCell 类型。第一个单元格类型包含一个子视图,当我点击它时我希望它做一些事情。我的问题是,我向 UIViewController.view 添加了一个隐藏键盘的 UITapGestureRecognizer。因此,点击屏幕上的任意位置只会隐藏键盘。当用户点击第一个单元格的子视图时,我如何禁用这个点击手势?我已经尝试了以下但我怀疑我没有完全正确地找到第一个单元格的子视图上的触摸以禁用 UIViewController.view tapGesture.
的代码
class CommentMainViewController: UIViewController, UITextViewDelegate, UIGestureRecognizerDelegate{
var myTableView: CommentOnPostTableView! // Custom UITableView
var screenTapGesture: UITapGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
...
screenTapGesture = UITapGestureRecognizer.init(target: self, action: #selector(hideKeyBaord))
screenTapGesture.delegate = self
self.view.addGestureRecognizer(screenTapGesture)
...
}
func hideKeyBaord(){
// Hides the keyboard
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if gestureRecognizer == screenTapGesture{
let researchCell = myTableView.cellForRow(at: [0,0]) // First cell only
if let imageCarousel = researchCell?.imageView{
let location = touch.location(in: imageCarousel)
let isTouchImage = imageCarousel.frame.contains(location)
if isTouchImage{
print("IMAGE TOUCHED!")
// Disable screenTapGesture
return false
}else{
return true
}
}
return true
}else{
return false
}
}
}
我认为你的问题是隐藏键盘的点击手势取消了其他触摸。
只需将点击手势的 cancelsTouchesInView 属性 设置为 false,如下所示:
screenTapGesture.cancelsTouchesInView = false
我有一个带有两个不同自定义 UITableViewCell 的 tableView。 tableView 中的第一个单元格始终为 ResearchPostFeedTableViewCell 类型,其余单元格为 CommentTableViewCell 类型。第一个单元格类型包含一个子视图,当我点击它时我希望它做一些事情。我的问题是,我向 UIViewController.view 添加了一个隐藏键盘的 UITapGestureRecognizer。因此,点击屏幕上的任意位置只会隐藏键盘。当用户点击第一个单元格的子视图时,我如何禁用这个点击手势?我已经尝试了以下但我怀疑我没有完全正确地找到第一个单元格的子视图上的触摸以禁用 UIViewController.view tapGesture.
的代码class CommentMainViewController: UIViewController, UITextViewDelegate, UIGestureRecognizerDelegate{
var myTableView: CommentOnPostTableView! // Custom UITableView
var screenTapGesture: UITapGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
...
screenTapGesture = UITapGestureRecognizer.init(target: self, action: #selector(hideKeyBaord))
screenTapGesture.delegate = self
self.view.addGestureRecognizer(screenTapGesture)
...
}
func hideKeyBaord(){
// Hides the keyboard
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if gestureRecognizer == screenTapGesture{
let researchCell = myTableView.cellForRow(at: [0,0]) // First cell only
if let imageCarousel = researchCell?.imageView{
let location = touch.location(in: imageCarousel)
let isTouchImage = imageCarousel.frame.contains(location)
if isTouchImage{
print("IMAGE TOUCHED!")
// Disable screenTapGesture
return false
}else{
return true
}
}
return true
}else{
return false
}
}
}
我认为你的问题是隐藏键盘的点击手势取消了其他触摸。
只需将点击手势的 cancelsTouchesInView 属性 设置为 false,如下所示:
screenTapGesture.cancelsTouchesInView = false