如何为 UITableViewCell 的子视图禁用 UITapGesture?
Posted
技术标签:
【中文标题】如何为 UITableViewCell 的子视图禁用 UITapGesture?【英文标题】:How to disable UITapGesture for a subView of UITableViewCell? 【发布时间】:2020-06-11 08:16:55 【问题描述】:我有一个带有两个不同自定义 UITableViewCells 的 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
【问题讨论】:
【参考方案1】:我认为您的问题是隐藏键盘的点击手势取消了其他触摸。
只需将点击手势的 cancelsTouchesInView 属性设置为 false,如下所示:
screenTapGesture.cancelsTouchesInView = false
【讨论】:
超优雅的单眼线解决方案。谢谢!以上是关于如何为 UITableViewCell 的子视图禁用 UITapGesture?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode:如何为使用 Storyboard 创建的子视图设置委托?
iPhone/iOS:如何为 Scrollview 的子视图实现拖放?