Statusbar 捕獲狀態(tài)欄的點(diǎn)擊事件(ios 13及 ios 13 之前)

根據(jù)對應(yīng)的系統(tǒng)版本,實現(xiàn)上會有差異。

iOS 13 之前

主要通過在 appdelegate 中 override touchbegan 事件來實現(xiàn)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        
        // iOS 13 之后,點(diǎn)擊狀態(tài)欄的回調(diào)不會進(jìn)入這里,而是在 UIStatusBarManager+CAPHandleTapAction 中處理
        if #available(iOS 13.0, *) {
            return
        }
        
        let statusBarRect = UIApplication.shared.statusBarFrame
        guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return }
        
        if statusBarRect.contains(touchPoint) {
            NotificationCenter.default.post(name: StatusBarTappedNotification.name, object: nil)
        }
    }

還有一種是自己實現(xiàn)一個 UIWindow 覆蓋在 狀態(tài)欄的那一級 UIWindow 上。這里就不記錄了


iOS 13 之后

iOS13: how to detect a status bar click event?

進(jìn)入 iOS 13,touchBegan 的方法不會被調(diào)用到了。網(wǎng)上提供了一種思路來解決。

  • 簡而言之,就是通過調(diào)用私有函數(shù),來監(jiān)聽狀態(tài)欄的點(diǎn)擊事件。因此如果是上架的 App 不在本文的討論范圍內(nèi)(因為你實現(xiàn)了也沒用,上架會被拒)

實現(xiàn)思路

通過 objective-ccategory 去復(fù)寫 UIStatusBarManager(iOS 13 之后才提供的 API) 中的私有方法 handleTapAction 實現(xiàn)監(jiān)聽。

注意,swift 的 extension 去實現(xiàn)復(fù)寫私有函數(shù)的方法還沒查到怎么做。如果有知道的歡迎補(bǔ)充。
如果工程采用了 swift,那么這里在添加 objective-c category 實現(xiàn)之后,要在 橋接的 bridge.h 中 import

UIStatusBarManager+CAPHandleTapAction.h

#import <UIKit/UIKit.h>

@interface UIStatusBarManager (CAPHandleTapAction)

/*
    使用 category 復(fù)寫私有方法,捕獲狀態(tài)欄的點(diǎn)擊事件
    僅當(dāng) iOS 13 以上系統(tǒng),才去監(jiān)聽狀態(tài)欄的點(diǎn)擊事件,iOS 13 之前的,則在 appdelegate 中的 touchesBegan 捕獲
 */

@end

UIStatusBarManager+CAPHandleTapAction.m

#import "UIStatusBarManager+CAPHandleTapAction.h"

@implementation UIStatusBarManager (CAPHandleTapAction)

- (void)handleTapAction:(id)callback {
    // 僅當(dāng) iOS 13 以上系統(tǒng),才去監(jiān)聽狀態(tài)欄的點(diǎn)擊事件,iOS 13 之前的,則在 appdelegate 中的 touchesBegan 捕獲
    if (@available(iOS 13.0, *)) {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"StatusBarTappedNotification"
                                                            object:nil];
    }
}

@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 自從,搜狐博客各種毛病以后,不愿意寫東西了,新出來的各種軟件動不動就注冊,麻煩的要死,我只是想隨手寫點(diǎn)碎碎念而已…...
    人生何處不矯情閱讀 203評論 0 0
  • 以前有個男孩,他夢想有一天能迎娶鄰居家青梅竹馬的姑娘,因為父母是世交,所以他們理所當(dāng)然的定了親。男孩的夢想并不難...
    喬幽閱讀 365評論 0 1
  • 人身體的一切疾病都可以從情緒中找到根源,嚴(yán)格來說,每一種情緒都需要找到一個突破口,如果不能得到合理的宣泄,...
    在路上_9baa閱讀 476評論 0 0
  • 夏天最美的瞬間——遇見你 扎個小辮子,小錢如我 它是一株草,茂盛到把花盆抵滿 垂下長枝條,乍一看是柳枝 為數(shù)不多幾...
    HR_欣姐閱讀 256評論 2 3
  • 兒子還不會說話,不過已經(jīng)知道表達(dá)需求。 中午,他看到門口的樹上掛了小燈籠想要,于是一直“啊啊啊”地給我指。后來???..
    十月桃子閱讀 817評論 0 0

友情鏈接更多精彩內(nèi)容