自定义UIScrollView中的UIButton无法响应触摸事件求助
针对你遇到的层级结构(Custom Scroll View → Container View → View → Button)下按钮点击事件不响应的问题,除了你已经检查的isUserInteractionEnabled和frame,还有这些常见的排查方向:
检查自定义ScrollView的触摸拦截逻辑
如果你在自定义ScrollView里重写了hitTest(_:with:)或者point(inside:with:)方法,很可能不小心拦截了按钮的触摸事件。比如如果方法里没有正确返回子视图的响应者,或者错误地返回了self,就会导致下层的按钮接收不到触摸。
建议检查这两个方法的实现,确保当触摸点落在按钮区域内时,能正确返回对应的按钮实例,而不是拦截下来。确认Container View的frame和布局约束
有时候Container View的frame可能看起来正常,但实际它的bounds或者布局约束有问题,导致它的子视图(也就是那个包含按钮的View)超出了它的范围。虽然按钮自己的frame正常,但如果它的父视图(Container View)的clipsToBounds设为true,或者父视图本身的范围没有覆盖到按钮,也会影响触摸传递。
可以通过Debug View Hierarchy工具查看各个视图的实际布局范围,确认所有父视图的bounds都能完整包含按钮。检查是否有其他视图遮挡
可能存在一个透明或者隐藏的视图(比如某个背景视图、手势识别器的关联视图)覆盖在按钮上方,虽然看不见,但拦截了触摸事件。同样用Debug View Hierarchy工具逐层检查视图层级,看看按钮上方有没有其他视图。检查手势识别器的冲突
如果自定义ScrollView或者它的父视图添加了手势识别器(比如UIPanGestureRecognizer),可能会和按钮的点击手势冲突。可以尝试暂时移除这些手势,看看按钮是否能正常响应。如果是手势冲突,可以通过设置手势的cancelsTouchesInView为false,或者实现UIGestureRecognizerDelegate的gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)方法来允许同时识别。重新检查添加目标事件的代码
虽然你说在自定义视图和控制器里都加了目标,但还是要确认代码有没有写错。比如:// 正确的写法示例 button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)要确保
selector对应的方法存在,并且方法的签名正确(比如@objc func buttonTapped(_ sender: UIButton)),同时self的生命周期正常,没有被提前释放。
内容的提问来源于stack exchange,提问作者Emre Önder

