Учебное пособие по iOS AirPlay для второго экрана

Я собираюсь добавить возможности AirPlay в один из моих ViewController. Контроллер представления просто показывает UIWebView. Я хочу добавить кнопку, которая будет отображать этот контент на Apple TV. Я знаю, что можно сделать общесистемное зеркальное отображение, но оно не заполняет весь экран, вокруг есть черные полосы. Я искал в Интернете, но почти все, что я нашел, давно прошло от iOS 5 и устарело. Может ли кто-нибудь указать мне на руководство или библиотеку, которая могла бы помочь? Мне просто нужно, чтобы он отображал содержимое всего одного просмотра в полноэкранном режиме на Apple TV.

Пока что я сделал вот что, но я считаю, что он создает только второе окно, ничего не помещая в него.

В AppDelegate я создаю для него свойство:

@property (nonatomic, retain) UIWindow *secondWindow;

В методе didFinish AppDelegate я запускаю:

 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;

    }

}

В viewController, в котором я хотел бы разрешить зеркальное отображение WebView на Apple TV, у меня есть:

- (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");

    }
}

Все это я получил от здесь. Однако это все, что он показывает, поэтому я не уверен, как вывести контент на этот экран.


person user717452    schedule 05.01.2014    source источник
comment
Вы когда-нибудь придумывали решение? Я пытаюсь сделать то же самое прямо сейчас.   -  person Daniel    schedule 12.07.2017
comment
@Daniel К сожалению, нет. Я прибегал к тому, чтобы люди делали зеркальное отображение экрана в эфире, что далеко не так элегантно и полезно, но да ладно. 5000 просмотров не могут понять.   -  person user717452    schedule 24.07.2017


Ответы (3)


В зависимости от того, что происходит в вашем веб-представлении, вам нужно будет либо сделать так, чтобы второе было направлено на ту же страницу, либо переместить существующее в новое окно. В любом случае вы относитесь ко второму окну примерно так же, как и к главному окну вашего приложения - добавьте в него представления, и они должны появиться на втором дисплее.

person Noah Witherspoon    schedule 07.01.2014
comment
Я добавил к методу checkForAdditional ..., изменив корневое представление на новое окно, добавив представление и подпредставление, но он по-прежнему ничего не делает. - person user717452; 08.01.2014

Я предполагаю, что вы это видели, но это единственный образец проекта, который я смог найти: https://github.com/quellish/AirplayDemo/

Вот несколько связанных вопросов, которые стоит прочитать:

кто-нибудь знает, как начать трансляцию?

Airplay Mirroring + External UIScreen = полноэкранное воспроизведение видео UIWebView? < / а>

iOS AirPlay: мое приложение получает уведомление о внешнем дисплее только при включенном зеркальном отображении?

Удачи!

person livingtech    schedule 14.01.2014

На данный момент есть только два варианта «зеркалирования» Airplay: общесистемный мониторинг и полностью настраиваемое зеркалирование. Поскольку общесистемное зеркалирование не является решением для вас, вам придется пойти по пути, который вы уже указали в своих фрагментах кода.

Как указал Ной, это означает предоставление контента для второго экрана так же, как и для внутреннего дисплея. Насколько я понимаю, вы хотите отображать те же данные / веб-сайт, что и раньше, на внутреннем дисплее, но отображать их по-другому в удаленном представлении / веб-просмотре (например, с другим соотношением сторон). Один из способов может заключаться в том, чтобы один веб-просмотр следовал за другим в настройке ведущий / ведомый. Вам нужно будет отслеживать изменения (например, прокрутки пользователя) в главном устройстве и распространять их на подчиненное устройство. Второй способ может заключаться в рендеринге исходного содержимого веб-просмотра в буфер и частичном рисовании этого буфера в «тупом» UIView. Это будет немного быстрее, так как веб-сайт не придется загружать и обрабатывать дважды.

person NSSplendid    schedule 13.01.2014
comment
Просто некоторые мысли о старых ответах: я думаю, было бы проще скопировать запросы исходного webView и вызвать соответствующие методы на внешней копии. Кроме того, при другом аспекте веб-сайты не будут такими высокими, поэтому потребуется соответствующим образом перевести величину прокрутки. - person Julian F. Weinert; 15.10.2015
comment
Тем не менее OP искал способ отобразить второе окно на устройстве AirPlay. - person Julian F. Weinert; 15.10.2015