2013-10-05 70 views
2

我創建自定義的控件,可以爲MPMoviePlayerController,所以我有通過MPVolumeView手動添加自己的AirPlay按鈕。如何確定的AirPlay酥料餅的視圖可見

每當我在自定義影片播放器控件消失,我開始一個計時器,將淡出出來若干秒後。但在淡出之前,我想檢查AirPlay彈窗視圖是否可見 - 如果是,則延遲淡出直到彈出視圖消失。我該怎麼做?

AirPlay UIPopoverView

我如何編程確定的AirPlay酥料餅的看法是可見的?

回答

3

首先,有公共的API,可以讓你做到這一點在任何方法。

如果你確實想試試,我能想到的一個方法是觀察你的應用程序的主窗口,並尋找出每當酥料餅的視圖被添加到視圖層次結構。通過進一步觀察這個彈出窗口,你應該能夠告訴它何時被解僱。

但是,這真的很不方便,因爲它依賴於底層的實現不會改變(在未來的iOS版本中它可能並且不可避免地會)。

1

隨着LXT的指導下,我設法把東西在一起。這並不理想,但它似乎爲我工作。

我向airplay按鈕添加了一個輕擊手勢,以知道何時開始觀察關鍵窗口。當它被挖掘時,我開始觀察。

- (void)airplayTapped:(UITapGestureRecognizer *)gesture { 
    NSLog(@"airplay added"); 
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
    if (!keyWindow) { 
     keyWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0]; 
    } 

    // this occurs before the airplay popover view is added, so this is the 
    // number we want to check for in observeValueForKeyPath: to determine 
    // if the view has been dismissed 
    self.windowSubviews = keyWindow.layer.sublayers.count; 

    [keyWindow addObserver:self forKeyPath:@"layer.sublayers" options:NSKeyValueObservingOptionNew context:NULL]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (![keyPath isEqualToString:@"layer.sublayers"]) { 
     return; 
    } 
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
    if (!keyWindow) { 
     keyWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0]; 
    } 
    if (keyWindow.layer.sublayers.count == self.windowSubviews) { 
     NSLog(@"airplay removed"); 
     [keyWindow removeObserver:self forKeyPath:@"layer.sublayers"]; 
    } 
} 

注意,沒有在UIKit的保證是KVO兼容,所以不是觀察窗口的子視圖,我們可以看到它的層的子層。

正如LXT說,這可能會破壞很容易,但我的目的,將做的工作。

+0

由於您的KVO子圖層數量,當您計算您的子圖層並重新依賴該數目之間發生通知時會發生什麼情況?看來這會打破? 出於好奇:也許你遇到了這個問題並找到了解決辦法。如果你有,請分享。 –