1

我有一个在子视图中显示视频的应用程序,如果可以选择在第二个屏幕(例如 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);

无论如何,即使我添加/删除 Apple TV 或在 iPad 上进入/退出镜像模式,它们也不会触发。

哦; 如果我这样做

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

那么这也可以按预期工作。视频现在在 Apple TV 上全屏显示,iPad 上包含 avPlayer 的 UIView 变灰而不是显示视频。

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

归根结底,我认为我需要的只是设法获得

当我启动应用程序时,UIScreen.Screens.Length 等于 2。

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

4

1 回答 1

1

当应用程序在已启用屏幕镜像的情况下启动时,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方法。

于 2018-02-06T22:54:37.153 回答