在两个屏幕上运行的 iOS 应用程序(无镜像)

Posted

技术标签:

【中文标题】在两个屏幕上运行的 iOS 应用程序(无镜像)【英文标题】:iOS app which runs on two screen (no mirroring) 【发布时间】:2011-11-01 23:44:39 【问题描述】:

我创建了一个包含幻灯片的 iPad 应用程序,当用户点击此幻灯片时,他/她可以输入一些信息。

我现在想做的是在通过 AirPlay 连接电视和 iPad 时在电视上显示幻灯片内容(如果可能,也可以使用电缆,但这似乎只是镜像)

这可以吗?我们可以让幻灯片在电视和 iPad 上运行,然后当用户在 iPad 上点击幻灯片时,凭据输入屏幕将显示,但在电视上仍将显示基础幻灯片而不是凭据?

如何在 ios 中做到这一点?是否可以在电视上显示应用程序的一部分?所以不要镜像整个应用程序。

【问题讨论】:

我实际上是在 iPhone 4s 上试用 AirPlay。只有在任务栏中的播放控件上设置了镜像选项后,我才设法让它与我的 Apple TV 2 一起使用。在发布类似问题之前,我将在此处浏览其他可能的答案。 你能把我的答案标记为正确吗?现在肯定有这么多的赞成票它被认为是正确的? 【参考方案1】:

您可以编写应用程序以使用 Airplay 和 Apple TV 处理 2 个 UIScreen,然后为 TV UIScreen 和 iPad UIScreen 设置单独的根视图控制器。然后在电视的视图控制器上显示图像或幻灯片,并从 iPad 视图控制器的事件中运行它!

在 CLIFS 评论后修改:

所以首先在你的应用代理中 didFinishLaunchingWithOptions 或 didFinishLaunching 设置一个通知来接收屏幕确实连接。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidConnect:) name:UIScreenDidConnectNotification object:nil];

然后您需要保留对单独窗口的引用并将控制器推送到它,就像您对任何其他窗口一样。

- (void) myScreenInit:(UIScreen *)connectedScreen:(UIViewController*)mynewViewController
    
    //Intitialise TV Screen
   if(!windowTV)
    
        CGRect frame = connectedScreen.bounds;
        windowTV = [[UIWindow alloc] initWithFrame:frame];
        windowTV.backgroundColor = [UIColor clearColor];
       [windowTV setScreen:connectedScreen];
        windowTV.hidden = NO;
    

    UIViewController* release = windowTV.rootViewController;
    windowTV.rootViewController = mynewViewController;
    [release removeFromParentViewController];
    [release release];


- (void)setTvController:(UIViewController*)mynewViewController
     
    UIViewController* release = windowTV.rootViewController;
    windowTV.rootViewController = mynewViewController;
    [release removeFromParentViewController];
    [release release];


- (void)screenDidConnect:(NSNotification *)notification 
     [self myScreenInit:[notification object]];

【讨论】:

这个答案不包括如何完成的细节。它只提到在结尾加上一个激动的感叹号是可能的。 我删除了我的反对票。这里还有更多答案。对 API 完全陌生的人(就像我几天前一样)不会在您在上面发布的内容之后在辅助屏幕上看到任何内容。 公平地说,如果您在没有了解视图层次文档的情况下跳入其中,那么您在走路之前就尝试过跑步。 这是一个很好的答案。当我构建我的应用程序时,AirPlay 只是一个白日梦,但我使用它的一个变体来响应第二个屏幕(在我的情况下,通过电缆连接到电视/显示器)并将正确的视图推送给它。 screenDidConnect 或 screenDidDisconnect 通知在您关闭镜像选项时不会触发。这不是一个好的答案。【参考方案2】:

iOS 5.0 中似乎存在一个错误,这使得这很棘手。您必须从正在运行的任务栏启用镜像(在通过 API 检测到第二个屏幕之前一直向左滚动。我在此处的问题中发布了详细信息:How to use iOS 5+ AirPlay for a second screen

【讨论】:

我说杯子是半空的,他们说它是半满的。一个功能显然是一些类似 GameKit 的 API 调用,用于扫描和检测附近的 AirPlay 兼容设备。

以上是关于在两个屏幕上运行的 iOS 应用程序(无镜像)的主要内容,如果未能解决你的问题,请参考以下文章

iOS13和外屏镜像

iOS App图标未出现在屏幕上

UIImageView在设备上的启动屏幕中丢失图像

iOS 11 + Xcode 9.0 = 无音频单元

如何为iOS设备制作录屏指导视频

如何在 iPad 上运行的 iPhone 应用程序中获取 iOS 8 自定义键盘的主机应用程序屏幕几何图形?