2014-01-05 7 views
6

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

До сих пор вот что я сделал, но я считаю, что он создает только второе Окно, не вкладывая в него ничего.

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

    } 
} 

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

+0

Вы когда-нибудь придумывали решение? Я пытаюсь сделать то же самое прямо сейчас. – Daniel

+1

@ Даниэль К сожалению, нет, я этого не сделал. Я прибегал к тому, чтобы люди отображали экраны экрана в эфире, что не так элегантно и полезно, но хорошо. 5000 просмотров не могут понять это. – user717452

ответ

3

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

+0

Я добавил к методу checkForAdditional ..., изменив корневой режим в новом окне, добавив представление и подвью, но он все равно ничего не делает. – user717452

0

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

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

+0

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

+0

Тем не менее, OP искал способ отображения второго окна на устройстве AirPlay. –

1

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

Вот некоторые вопросы, которые могут быть стоит прочитать:

does anyone know how to get started with airplay?

Airplay Mirroring + External UIScreen = fullscreen UIWebView video playback?

iOS AirPlay: my app is only notified of an external display when mirroring is ON?

Удачи вам!

+0

Существует продолжение: https://github.com/quellish/AirPlayStoryboards – quellish