【问题标题】:iOS13: how to detect a status bar click event?iOS13:如何检测状态栏点击事件?
【发布时间】:2019-08-02 10:03:36
【问题描述】:

在我的 appDelegate 中,我覆盖 touchesBegan 以检测何时单击状态栏:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    CGPoint location = [[[event allTouches] anyObject] locationInView:kWindow];
    CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;

    if (CGRectContainsPoint(statusBarFrame, location)) {
        ///do something 
    }
}

在 iOS 13 之前,这有效;在 iOS 13 上,它没有。该方法永远不会执行。我该如何解决这个问题?

【问题讨论】:

标签: objective-c ios13


【解决方案1】:

经过一番研究,我发现状态栏在 iOS13 上不再是应用程序的一部分,而是系统 UI 的一部分(“跳板”)。您需要通过UIStatusBarManager访问它

所以这不再有效:

CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;

在 iOS 13 中,您需要像这样获取 StatusBar 框架:

UIStatusBarManager *manager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;
CGRect statusBarFrame = manager.statusBarFrame;

【讨论】:

  • 嗨,alxlives,谢谢你的回答。我尝试使用 UIStatusBarManager 创建一个视图,并将点击事件添加到此视图,但没有响应。
  • 你好。我不太了解创建视图部分。您是否尝试过 this solution 但从 UIStatusBarManager 获取状态栏框架?
  • @alxlives 我认为@dfwang 正在做的是使用 UIStatusBarManager 的框架在同一位置创建一个视图,然后使用该视图拦截触摸事件?我不确定这是否可行。您发布的链接依赖于 touchesBegan 被调用,但在 iOS 13 中点击状态栏时不会被调用。到目前为止,我还没有看到一种方法来检测 iOS 13 中状态栏上的点击。
  • @Xeaza 你找到检测状态栏触摸的解决方案了吗?
  • @JayeshkumarSojitra,还没有。我有一个未解决的问题,其中包括我迄今为止发现的内容:stackoverflow.com/questions/57806710/…
【解决方案2】:

在 iOS 13 中,StatusBar 事件由UIStatusBarManager 管理,当点击 StatusBar 时会调用这些方法:

-[UIStatusBarManager _handleScrollToTopAtXPosition:]
-[UIStatusBarManager handleTapAction:]

所以,你可以挂钩-[UIStatusBarManager handleTapAction:]来检测StatusBar点击事件

【讨论】:

  • _handleScrollToTopAtXPosition 是私人的,所以我觉得我听不到,对吧?
猜你喜欢
  • 2023-03-12
  • 2023-03-10
  • 2012-10-29
  • 1970-01-01
  • 2018-12-18
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
相关资源
最近更新 更多