iOS13:如何检测状态栏的单击事件?

dfw*_*ang 9 objective-c ios13

在我的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 
    }
}
Run Code Online (Sandbox Code Playgroud)

在iOS 13之前,此功能有效;在iOS 13上则没有。该方法从不执行。我怎样才能解决这个问题?

alx*_*ves 3

经过一番研究,我发现状态栏在iOS13上不再是应用程序的一部分,它\xe2\x80\x99s是系统UI的一部分(\xe2\x80\x9cspringboard\xe2\x80\x9d)。您需要通过UIStatusBarManager访问它

\n\n

所以这不再有效:

\n\n
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
UIStatusBarManager *manager = [UIApplication sharedApplication].keyWindow.windowScene.statusBarManager;\nCGRect statusBarFrame = manager.statusBarFrame;\n
Run Code Online (Sandbox Code Playgroud)\n