Airplay:外部窗口上的镜像子视图

时间:2012-04-08 10:56:08

标签: ios uiview external mirroring airplay

关于airplay的设计/建筑问题。 我在AppDelegate中设置了一个外部显示器:

UIScreen *externalScreen = UIScreen.screens.lastObject;
self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreenFrame];
self.externalWindow.screen = externalScreen;
self.externalWindow.backgroundColor = [UIColor redColor];

工作正常,电视显示红色的空白屏幕。 现在我有一个带有一组子视图的ViewController,一个视图应该显示在设备外部屏幕上。如果我在ViewController.m中尝试这个:

[_appDelegate.externalWindow addSubview:self.deviceAndTVView];

deviceAndTVView将仅显示在外部屏幕上,而不再显示在设备上。 我需要的是在设备上安装deviceAndTVView,在触摸/用户交互时更新自己,并在外部屏幕上镜像这些更新。

实现这一目标的正确道路是什么?

感谢阅读! 米

2 个答案:

答案 0 :(得分:14)

名为AirPlay镜像的技术名称很差。它实际上以两种模式运行,一种是将整个iOS设备镜像到AirPlay设备,另一种模式是连接镜像AirPlay设备,开发人员可以使用两种UIWindow / UIScreen。

您正在使用后一种模式,通常称为“镜像”,但实际上您需要一个完全独立的窗口/屏幕来管理,并且应该有更好的术语来引用这种操作模式。

您在上面所描述的内容基本上是移动从设备窗口到AirPlay窗口的UIView,并且它正常工作!

在这两个窗口中,没有技术方法可以让UIView显示的单个实例 - 它将存在于一个UIView层次结构中,或者存在于另一个UIView层次结构中,但不能同时存在于两个窗口中。换句话说,如果您希望在两个屏幕上显示相同的内容,则需要创建相同UIView的两个实例,并将它们分别添加到两个窗口,然后将它们更新为他们改变了。

虽然这可能不是您所期待的超级“镜像”,但它可能是一件好事,因为您的UIView可能在设备上具有与在AirPlay设备上不同的纵横比。通过两个不同的视图,显示相同的内容,您可以调整AirPlay视图的大小,以最好地利用设备的可用分辨率。

答案 1 :(得分:1)

我可以想到几种方法。您是否考虑过使用KVO?本地和外部视图都可以观察到推动其内容的任何模型或控制器。