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

iOS 13状态栏点击事件无法触发,原iOS 12适配代码失效求助

解决方案:iOS 13+ 状态栏点击事件处理

嘿,这个问题我升级iOS13的时候也踩过一模一样的坑!原来的statusBarFrame在iOS13开始被官方弃用,而且UIApplication.shared.window的获取逻辑也有了变化,给你两个实用的解决办法,按需选就行:

方案一:适配iOS13+的官方API方式

iOS13引入了UIWindowScene,我们可以通过它的statusBarManager来获取状态栏的正确frame,同时调整触摸点的坐标转换逻辑:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    
    guard let touch = event?.allTouches?.first else { return }
    // 获取当前window对应的scene
    guard let windowScene = view.window?.windowScene else { return }
    // 获取iOS13+下的状态栏frame
    let statusBarRect = windowScene.statusBarManager?.statusBarFrame ?? .zero
    
    // 转换触摸点到window坐标系
    let touchPoint = touch.location(in: view.window)
    
    if statusBarRect.contains(touchPoint) {
        // 这里处理状态栏点击事件
        print("状态栏被点击啦!")
    }
}

方案二:添加透明覆盖视图(兼容全版本)

如果需要同时兼容iOS12及更早版本,推荐用这个方法——在状态栏位置添加一个透明的点击监听视图,完全不依赖系统API的变化:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 创建透明的状态栏点击监听按钮
    let statusBarTapButton = UIButton(type: .system)
    statusBarTapButton.addTarget(self, action: #selector(statusBarTapped), for: .touchUpInside)
    statusBarTapButton.backgroundColor = .clear
    
    // 适配不同iOS版本的状态栏高度
    let statusBarHeight: CGFloat
    if #available(iOS 13.0, *) {
        statusBarHeight = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 20
    } else {
        statusBarHeight = UIApplication.shared.statusBarFrame.height
    }
    
    // 设置按钮frame,覆盖整个状态栏区域
    statusBarTapButton.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: statusBarHeight)
    // 添加到window上,确保不会被其他视图遮挡
    view.window?.addSubview(statusBarTapButton)
}

@objc private func statusBarTapped() {
    // 处理状态栏点击事件
    print("状态栏被点击啦!")
}

注意:第二种方法里,建议在viewWillLayoutSubviews里重新调整监听视图的frame,避免设备旋转、状态栏高度变化时出现点击区域错位的问题。

内容的提问来源于stack exchange,提问作者Sunil Maurya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:03