置于自定义UIWindow的悬浮WKWebView无法接收触摸事件如何解决
悬浮WKWebView触摸无响应解决方案
问题根源
- 初始化逻辑冗余:已经为自定义Window设置了
rootViewController,系统会自动将根控制器的视图挂载到Window上,额外手动调用addSubview添加悬浮视图会导致层级混乱,影响事件传递。 - 事件拦截逻辑错误:重写的
hitTest方法直接返回固定的悬浮视图,截断了系统默认的事件遍历流程,导致悬浮视图内部的WKWebView无法接收到触摸事件。
修复步骤
1. 修正初始化方法
去掉冗余的视图添加代码,修正后的代码如下:
init(frame: CGRect, statusBarStyle: UIStatusBarStyle, viewController:FloatableViewController) { self.floatingWindowRootViewController = viewController super.init(frame: frame) self.rootViewController = floatingWindowRootViewController // 设置windowLevel保证悬浮在最上层,可根据需求调整等级 self.windowLevel = .alert + 1 self.isHidden = false }
2. 修正事件透传逻辑
不需要自定义复杂的hitTest逻辑,只需要重写point(inside:with:)实现点击区域判断,只有点击落在悬浮视图范围内时当前Window才响应事件,否则透传给下层Window:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { guard let floatingView = floatingWindowRootViewController?.floatingView else { return false } // 将点击坐标转换到悬浮视图坐标系下,判断是否在悬浮视图范围内 let convertPoint = self.convert(point, to: floatingView) return floatingView.bounds.contains(convertPoint) } // 无需重写hitTest方法,使用系统默认实现即可,系统会自动遍历子视图找到真正响应事件的WKWebView
额外校验项
- 确认悬浮视图、WKWebView的
isUserInteractionEnabled属性均为true - 不要给WKWebView添加配置了
cancelsTouchesInView = true的手势识别器,避免事件被拦截 - 确认自定义Window的
isHidden属性为false,且windowLevel高于主Window,保证视图可见且在最上层
内容的提问来源于stack exchange,提问作者Mehmet Baykar
相关产品推荐
相关产品推荐

