Swift中将UIButton作为叠加层放在UIScrollView上无法响应触摸怎么办
UIScrollView遮挡悬浮按钮无法响应触摸事件的解决方案
问题根本原因
你遇到的问题本质是响应链拦截导致的:即便你通过bringSubviewToFront(infoButton)把按钮移到了视图层级最前方,只要UIScrollView的frame覆盖了按钮所在区域,且UIScrollView默认开启用户交互,触摸事件在传递时会优先被UIScrollView接收处理,不会下发到按钮。
解决方案
- 优先推荐 调整视图层级归属
确保infoButton的父视图是当前控制器的根view,和UIScrollView为同级视图,不要添加到UIScrollView的子视图中。添加时保证按钮晚于UIScrollView添加到父视图,或显式调用view.bringSubviewToFront(infoButton),即可让触摸事件优先被层级更高的按钮捕获。 - 自定义UIScrollView拦截点击判定
继承UIScrollView自定义子类,重写point(inside:with:)方法,当点击区域属于按钮范围时直接跳过scrollView的响应,代码示例如下:
使用时将你的UIScrollView类替换为自定义的PassThroughScrollView,再把infoButton的frame加入class PassThroughScrollView: UIScrollView { // 存储需要跳过响应的控件frame var passThroughFrames: [CGRect] = [] override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { for frame in passThroughFrames where frame.contains(point) { return false } return super.point(inside: point, with: event) } }passThroughFrames数组即可。 - 临时关闭scrollView交互(仅适用于特定场景)
若按钮展示期间不需要scrollView响应滚动、点击等交互,可以直接设置scrollView.isUserInteractionEnabled = false,事件会正常透传到下方按钮。
内容的提问来源于stack exchange,提问作者Melodias
相关产品推荐
相关产品推荐

