第一步:在AppDelegate.m
中添加以下代码
#pragma mark - Status Bar Touch Event
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
CGPoint touchLocation = [[[event allTouches] anyObject] locationInView:self.window];
CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
if (CGRectContainsPoint(statusBarFrame, touchLocation))
{
[self statusBarTouchedAction];
}
}
- (void)statusBarTouchedAction {
[[NSNotificationCenter defaultCenter] postNotificationName:@"statusBarTappedNotification" object:nil];
}
第二步:在要触发点击事件的控制器中添加以下代码
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarAction:) name:@"statusBarTappedNotification" object:nil];
}
- (void)statusBarAction:(NSNotification *)noti{
//your code
}
注意:旧方法在iOS 13中已经废弃,因为iOS 13中采用多window模式,状态栏touch事件无法被捕捉。因此在iOS 13上获取statusBar点击事件只能使用另一种方法。通过hook私有方法来获取点击事件
第一步:新建分类文件
UIStatusBarManager+TapAction.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIStatusBarManager (TapAction)
@end
NS_ASSUME_NONNULL_END
UIStatusBarManager+TapAction.m
#import "UIStatusBarManager+TapAction.h"
#if TARGET_OS_IPHONE
#import <objc/runtime.h>
#import <objc/message.h>
#else
#import <objc/objc-class.h>
#endif
@implementation UIStatusBarManager (TapAction)
+ (void)load
{
Method orignalMethod = class_getInstanceMethod(self, @selector(handleTapAction:));
Method swizzledMethod = class_getInstanceMethod(self, @selector(statusBarTouchedAction:));
method_exchangeImplementations(orignalMethod, swizzledMethod);
}
- (void)statusBarTouchedAction:(id)sender{
[self statusBarTouchedAction:sender];
[[NSNotificationCenter defaultCenter] postNotificationName:@"statusBarTappedNotification" object:nil];
}
@end
第二步:在要触发点击事件的控制器中添加以下代码
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarAction:) name:@"statusBarTappedNotification" object:nil];
}
- (void)statusBarAction:(NSNotification *)noti{
//your code
}