如何确定AirPlay popover视图是否可见

时间:2013-10-05 23:57:56

标签: ios objective-c

我正在为MPMoviePlayerController创建自定义控件,因此我必须通过MPVolumeView手动添加我自己的AirPlay按钮。

每当我淡入我的自定义电影播放器​​控件时,我会启动一个计时器,在一定的秒数后将它们淡出。但在我淡出它们之前,我想检查一下AirPlay popover视图是否可见 - 如果是,则延迟淡出,直到弹出视图消失。我怎么能这样做?

AirPlay UIPopoverView

我如何以编程方式确定AirPlay popover视图是否可见?

2 个答案:

答案 0 :(得分:3)

首先,公共API中没有允许您执行此操作的方法。

如果您确实想尝试,我可以想到的一种方法是观察应用程序的主窗口,并在将弹出窗口视图添加到视图层次结构时查看。通过进一步观察此弹出窗口,您应该能够判断它何时被解除。

然而,这真的很糟糕,因为它依赖于不会改变的底层实现(在未来的iOS版本中它可以,并且不可避免地会这样)。

答案 1 :(得分: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所说,这可能很容易打破,但为了我的目的,它将完成这项工作。