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
相关产品推荐
相关产品推荐

