我正在为MPMoviePlayerController
创建自定义控件,因此我必须通过MPVolumeView
手动添加我自己的AirPlay按钮。
每当我淡入我的自定义电影播放器控件时,我会启动一个计时器,在一定的秒数后将它们淡出。但在我淡出它们之前,我想检查一下AirPlay popover视图是否可见 - 如果是,则延迟淡出,直到弹出视图消失。我怎么能这样做?
我如何以编程方式确定AirPlay popover视图是否可见?
答案 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所说,这可能很容易打破,但为了我的目的,它将完成这项工作。