Swift:UITableView内代码生成视图的点击手势无法触发求助
我来帮你排查这个红色视图点击手势没反应的问题,这种场景我之前处理过好多次,大概率是下面几个常见原因导致的,你可以逐一排查:
检查父容器的用户交互状态:
你的视图层级里,vsvViewContainer(垂直Stack View)如果关闭了用户交互,那它的子视图vContainer的手势肯定不会触发。Stack View默认isUserInteractionEnabled是true,但有时候会被误设置成false,所以一定要加上这句确认:vsvViewContainer.isUserInteractionEnabled = true另外还要往上查一层,确保对应的TableView Cell和它的contentView也开启了交互:
cell.isUserInteractionEnabled = true cell.contentView.isUserInteractionEnabled = true确认
vContainer有实际可点击的尺寸:
如果你没给vContainer设置足够的约束,它的frame可能是CGRectZero,看起来红色背景显示了但实际点击区域不存在。调试时可以打印vContainer.frame看看宽高是否正常,或者给它加上明确的约束,比如:NSLayoutConstraint.activate([ vContainer.heightAnchor.constraint(equalToConstant: 50), // 根据你的需求调整高度 vContainer.leadingAnchor.constraint(equalTo: vsvViewContainer.leadingAnchor), vContainer.trailingAnchor.constraint(equalTo: vsvViewContainer.trailingAnchor) ])排查子视图是否拦截了点击事件:
你提到vContainer内部还有其他视图,如果这些子视图(比如按钮、输入框)的isUserInteractionEnabled是true,并且占满了vContainer的区域,点击事件会被它们拦截,不会传递到vContainer的手势上。如果这些子视图不需要交互,记得把它们的isUserInteractionEnabled设为false。验证手势的Target是否存活:
你用self作为手势的target,要确保self(比如Cell实例或者ViewController)在手势触发时没有被释放。如果是TableView Cell的话,要注意Cell复用时的对象生命周期,避免target提前被销毁。
另外,你可以用Xcode的Debug View Hierarchy工具查看视图的实际层级和frame,或者在vContainer里重写point(inside point: CGPoint, with event: UIEvent?) -> Bool方法,打印日志确认点击是否命中了这个视图:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { print("点击命中vContainer") return super.point(inside: point, with: event) }
按照上面的步骤排查,应该能解决手势不触发的问题。
内容的提问来源于stack exchange,提问作者Vadim

