iOS11 以下AirPlay彈出框"取消"按鈕點擊事件獲取

先說下如何在App內(nèi)部觸發(fā)AirPlay

  • 首先我們要拿到系統(tǒng)的按鈕
 MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(260, 407, 40, 40)];

    [volumeView setShowsVolumeSlider:NO];

    for (UIButton *button in volumeView.subviews) {

        if ([button isKindOfClass:[UIButton class]]) {

            self.airplayButton = button;

            self.airplayButton.showsTouchWhenHighlighted = NO;

            [self.airplayButton setImage:[UIImageimageNamed:@"fav_audios_airplay.png"] forState:UIControlStateNormal];

            [self.airplayButton setBounds:CGRectMake(0, 0, 40, 40)];

            [self.airplayButton addObserver:self forKeyPath:@"alpha"options:NSKeyValueObservingOptionNew context:nil];

        }

    }

    [volumeView sizeToFit];

    [self.view addSubview:volumeView];

還需要添加這一段來設(shè)置多一次圖片和大小

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if ([object isKindOfClass:[UIButton class]] && [[change valueForKey:NSKeyValueChangeNewKey] intValue] == 1) {

        [(UIButton *) object setImage:[UIImageimageNamed:@"fav_audios_airplay.png"] forState:UIControlStateNormal];

        [(UIButton *) object setBounds:CGRectMake(0, 0, 40, 40)];

    }

}

在dealloc里面移除

- (void)dealloc {

    [self.airplayButton removeObserver:self forKeyPath:@"alpha"];

}
  • 通過以上代碼,就能過獲取到系統(tǒng)的按鈕,并可以自定義一些樣式.當(dāng)然你也可以完全自定義一個另外的按鈕.這個系統(tǒng)的按鈕通過for循環(huán)找到后,僅僅持有下便可.
    當(dāng)自定按鈕點擊時,只要將持有的系統(tǒng)按鈕響應(yīng)下事件便可.效果是一樣的.代碼如下:
[self.airplayButton sendActionsForControlEvents:UIControlEventTouchUpInside];

此時iOS11以下的iPhone變會彈出設(shè)備選擇框了,如下

40AA06A93D8F333454AE1A123D7254BA.jpg

正常情況下,流程走到這里就完了.但是,萬惡的產(chǎn)品汪給了一個變態(tài)的需求,我需要拿到用戶點出這個彈框后沒有選擇投屏設(shè)備而是點擊取消按鈕收回彈框的事件......

呵呵呵呵呵呵呵額!!!

通過一頓視圖調(diào)試后發(fā)現(xiàn):


F961F34A-9B17-4DD0-B665-A00337484171.png

這層彈框,其實就是個window,所以我們要拿到這個window

- (BOOL)isPresentAirPlayChooseWindow:(BOOL)isAddTarget {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *w in windows) {
        if([w isKindOfClass:NSClassFromString(@"_MPAVRoutingSheetSecureWindow")]) {
            return YES;
        }
    }
    return NO;
}
A9D75548-E428-4587-AC19-A937B6F835A0.png

上圖中的3個按鈕點擊后都會觸發(fā)彈框消失的時間,他們分別對應(yīng)下圖中的3個區(qū)域:


F5FDEF57-1805-4B33-BB28-2D1EB305B55C.png

所以我們找出window之后再拿到這三個按鈕,綁定下事件就ok了

- (BOOL)isPresentAirPlayChooseWindow:(BOOL)isAddTarget {
    NSArray *windows = [UIApplication sharedApplication].windows;
    for(UIWindow *w in windows) {
        if([w isKindOfClass:NSClassFromString(@"_MPAVRoutingSheetSecureWindow")]) {
            if(isAddTarget) {
                ///<找到系統(tǒng)的 "取消按鈕" 并捕捉事件
                UIView *view = w.subviews.firstObject;
                if([UIDevice currentDevice].systemVersion.floatValue < 11) {
                    [self addTargetForView_iOS10:view];
                }else {
                    [self addTargetForView_iOS11:view];
                }
            }
            return YES;
        }
    }
    return NO;
}

- (void)addTargetForView_iOS10:(UIView *)view {
    for(UIView *v in view.subviews) {
        if([v isKindOfClass:[UIButton class]]) {
//找到第一個button
            [((UIButton *)v) addTarget:self action:@selector(airplayChooseViewDismiss:) forControlEvents:UIControlEventTouchUpInside];
        }else if(v.subviews.count > 1 && ![v isKindOfClass:[UIButton class]]) {
            for(UIView *sv in v.subviews) {
                if([sv isKindOfClass:[UIButton class]]) {
//2,3號button
                    [((UIButton *)sv) addTarget:self action:@selector(airplayChooseViewDismiss:) forControlEvents:UIControlEventTouchUpInside];
                }
            }
        }
    }
}

好了,大功告成.....

至于iOS11以上,系統(tǒng)層級變了.一番探索后發(fā)現(xiàn)和iOS11以下有截然區(qū)別.不是單單添加一層window那么簡單,不是單單添加在單個app層面上的,貌似是和我們上拉下拉彈出的通知欄一個級別的.所以,沒有所以...媽個雞...

- (void)addTargetForView_iOS11:(UIView *)view {
    /*
     哦豁...
     */
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慧邮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舟陆,更是在濱河造成了極大的恐慌误澳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦躯,死亡現(xiàn)場離奇詭異忆谓,居然都是意外死亡,警方通過查閱死者的電腦和手機踱承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門倡缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勾扭,你說我怎么就攤上這事毡琉。” “怎么了妙色?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵桅滋,是天一觀的道長。 經(jīng)常有香客問我身辨,道長丐谋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任煌珊,我火速辦了婚禮号俐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定庵。我一直安慰自己吏饿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布蔬浙。 她就那樣靜靜地躺著猪落,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畴博。 梳的紋絲不亂的頭發(fā)上笨忌,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音俱病,去河邊找鬼官疲。 笑死袱结,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的途凫。 我是一名探鬼主播垢夹,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颖榜!你這毒婦竟也來了棚饵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掩完,失蹤者是張志新(化名)和其女友劉穎噪漾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體且蓬,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡欣硼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恶阴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈胜。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冯事,靈堂內(nèi)的尸體忽然破棺而出焦匈,到底是詐尸還是另有隱情,我是刑警寧澤昵仅,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布缓熟,位于F島的核電站,受9級特大地震影響摔笤,放射性物質(zhì)發(fā)生泄漏够滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一吕世、第九天 我趴在偏房一處隱蔽的房頂上張望彰触。 院中可真熱鬧,春花似錦命辖、人聲如沸况毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尔许。三九已至,卻和暖如春漓帚,著一層夾襖步出監(jiān)牢的瞬間母债,已是汗流浹背午磁。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工尝抖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毡们,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓昧辽,卻偏偏與公主長得像衙熔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搅荞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354