Apple TV作为iOS设备上的外部UIScreen

时间:2018-02-06 18:40:19

标签: c# ios apple-tv uiscreen external-display

我有一个应用程序,可以在子视图中显示视频,并且可以选择在第二个屏幕(如Apple TV)上显示该视频并能够使用该释放的空间来显示其他控件

我已经找到了各种有关如何做到这一点的帮助,但是我甚至在离开起跑门之前就撞墙了。

为了检测应用程序是否已在多显示环境中启动,所有示例代码都有一行如...

if (UIScreen.Screens.Length > 1) {
    // ...
}

(我在C#/ Xamarin中这样做,虽然我怀疑问题与此有关;无论如何,这些片段都在C#中)

我的问题是无论我做什么,屏幕数组总是1。 iPad正在运行iOS 11.2.5,如果我打开镜像,iPad就会被镜像,但是,屏幕数组只有一个项目。

还有一些观察员可以检测应用程序运行时添加/删除的屏幕。我还没有看到Xamarin的特定代码,但我认为它看起来像:

NSNotificationCenter.DefaultCenter.AddObserver(this, UIScreen.DidConnectNotification, NSKeyValueObservingOptions.New, IntPtr.Zero);
NSNotificationCenter.DefaultCenter.AddObserver(this, UIScreen.DidDisconnectNotification, NSKeyValueObservingOptions.New, IntPtr.Zero);

无论如何,即使我在iPad上添加/删除Apple TV或进入/退出镜像模式,这些也不会开火。

哦;如果我这样做

avPlayer.AllowsExternalPlayback = true;
avPlayer.UsesExternalPlaybackWhileExternalScreenIsActive = true;

然后也按预期工作。该视频现在在Apple TV上全屏显示,而包含avPlayer的iPad上的UIView灰显而不是显示视频。

但是,这不是我想要的。我想控制两个屏幕的布局,但两者都没有。 (虽然我确实希望Apple TV上的视频全屏显示,但我不希望它成为AVPlayerViewController,我确实希望重新利用iPad视频视图占用的屏幕空间)

在一天结束时,我认为我需要的只是设法

当我启动应用程序时,

UIScreen.Screens.Length等于2。

让UIScreen检测/报告第二个显示器的秘诀是什么?

1 个答案:

答案 0 :(得分:0)

当启动了已启用屏幕镜像的应用时,UIScreen.screens阵列最初只包含设备的屏幕。发布后不久,iOS会发布UIScreenDidConnect通知,通知您的应用已连接第二个屏幕。

启动时会看到,如果启用了镜像,则主屏幕的captured属性为true,但是在通知发布之后,您无法实际访问第二个屏幕发布。请注意,captured也可能表示正在进行屏幕录制。

虽然这看起来有点违反直觉,但它实际上使您的编码更简单;您无论如何都需要观察UIScreenDidConnectUIScreenDidDisconnect通知 ,现在您不需要编写任何特殊代码来处理应用程序启动时的情况已连接第二个屏幕。

您可以在didFinishLaunching

中使用类似的内容
let nc = NotificationCenter.default

nc.addObserver(forName: NSNotification.Name.UIScreenDidConnect, object: nil, queue: nil) { (notification) in
    print("Screen connected")
    self.enableExternalDisplay()
}

nc.addObserver(forName: NSNotification.Name.UIScreenDidDisconnect, object: nil, queue: nil) { (notification) in
    print("Screen disconnected")
    self.disableExternalDisplay()
}

<强>更新

实际上,当您真正想要通知观察时,您的代码中似乎有AddObserver的键/值观察格式。类似的东西:

NSNotificationCenter.DefaultCenter.AddObserver(UIScreen.DidConnectNotification,OnScreenConnected)

然后你需要实现OnScreenConnected方法。