iOS AirPlay第二屏幕教程

时间:2014-01-05 03:07:47

标签: ios uiwindow gnu-screen airplay apple-tv

我正在考虑将AirPlay功能添加到我的一个ViewControllers中。 View Controller只显示一个UIWebView。我想要做的是添加一个按钮,将此内容镜像到Apple TV。我知道系统范围的镜像可以完成,但它不会填满整个屏幕,周围都是黑条。我一直在网上搜索,但我发现的大部分内容都是从iOS 5回来并且已经过时了。有人能指出我的教程或插入库的方向会有所帮助吗?我只需要在Apple TV上将一个视图的内容镜像为全屏。

到目前为止,这是我所做的,但我相信它只会创建第二个窗口,而不会在其上放置任何内容。

在AppDelegate中,我为它创建了一个属性:

@property (nonatomic, retain) UIWindow *secondWindow;

在AppDelegate的didFinish方法中,我运行:

 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    [center addObserver:self selector:@selector(handleScreenDidConnectNotification:)
                   name:UIScreenDidConnectNotification object:nil];
    [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:)
                   name:UIScreenDidDisconnectNotification object:nil];

然后在AppDelegate中我有:

- (void)handleScreenDidConnectNotification:(NSNotification*)aNotification
{
    UIScreen *newScreen = [aNotification object];
    CGRect screenBounds = newScreen.bounds;

    if (!self.secondWindow)
    {
        self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds];
        self.secondWindow.screen = newScreen;

        // Set the initial UI for the window.
    }
}

- (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification
{
    if (self.secondWindow)
    {
        // Hide and then delete the window.
        self.secondWindow.hidden = YES;
        self.secondWindow = nil;

    }

}

在我想允许在Apple TV上镜像WebView的viewController中,我有:

- (void)checkForExistingScreenAndInitializeIfPresent
{
    if ([[UIScreen screens] count] > 1)
    {
        // Get the screen object that represents the external display.
        UIScreen *secondScreen = [[UIScreen screens] objectAtIndex:1];
        // Get the screen's bounds so that you can create a window of the correct size.
        CGRect screenBounds = secondScreen.bounds;

       appDelegate.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds];
        appDelegate.secondWindow.screen = secondScreen;

        // Set up initial content to display...
        // Show the window.
       appDelegate.secondWindow.hidden = NO;
        NSLog(@"YES");

    }
}

我从here得到了所有这些。但是,这就是它所显示的一切,所以我不确定如何将内容放到该屏幕上。

3 个答案:

答案 0 :(得分:3)

根据您的网络视图中的内容,您要么必须将第二个指向同一页面,要么将现有页面移动到新窗口。无论哪种方式,您对第二个窗口的处理方式与您对应用程序的主窗口添加视图几乎相同 - 它们应该显示在第二个窗口上。

答案 1 :(得分:1)

答案 2 :(得分:0)

目前Airplay'镜像'只有两个选项:系统范围的监控和完全自定义的镜像。由于系统范围的镜像不是您的解决方案,因此您必须按照已在代码片段中识别的方式进行操作。

正如诺亚所指出的,这意味着为第二个屏幕提供内容,就像为内部显示器提供内容一样。据我了解,您希望在内部显示器上显示与以前相同的数据/网站,但在远程视图/ webview中以不同方式显示(例如,不同的宽高比)。一种方法是在主/从设置中让一个webview跟随另一个。您必须监视主服务器中的更改(如用户搜索)并将其传播到从服务器。第二种方法是将原始webview内容渲染到缓冲区,并在“哑”UIView中部分绘制此缓冲区。这会更快一些,因为网站不必加载和渲染两次。