You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

置于自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:24:03