Представление содержания на внешнем дисплее

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

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

Для показа отдельного содержания на дисплее внешнего устройства Вы следуете за этим базовым процессом:

  1. При запуске приложения проверьте на присутствие внешнего дисплея и регистра для экранного соединения и уведомлений разъединения.

  2. Когда внешний дисплей доступен — запускаются ли в приложении или в то время как Ваше приложение работает — создают и конфигурируют окно для него.

  3. Свяжите окно с надлежащим объектом на экране, покажите второе окно и обновляйте его обычно.

Чтобы повторно позволить зеркально отразить после отображения уникального содержания, просто удалите окно, которое Вы создали из надлежащего объекта на экране.

Создайте новое окно, если уже присутствует внешний дисплей

Когда приложение запускается путем тестирования, можно проверить на присутствие второго дисплея screens массив окна UIScreen объект. Как правило, screens массив содержит только один объект на экране, потому что этот объект представляет дисплей узла основанное на iOS устройство. Если пользователь соединяется с внешним устройством, массив включает дополнительный объект на экране, представляющий внешний дисплей. основанные на iOS устройства, поддерживающие соединение с внешним дисплеем, включают iPhone и устройства iPod touch, имеющие дисплеи Сетчатки и iPad. Более старые устройства — такие как iPhone 3GS — не поддерживают внешние дисплеи.

Перечисление 2-1 показывает метод, что запускаются проверки на присутствие внешнего дисплея в приложении. Если второй дисплей доступен, он создает окно для него.

  Проверка перечисления 2-1 присутствие внешнего дисплея

- (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;
 
        self.secondWindow = [[UIWindow alloc] initWithFrame:screenBounds];
        self.secondWindow.screen = secondScreen;
 
        // Set up initial content to display...
        // Show the window.
        self.secondWindow.hidden = NO;
    }
}

Регистр для уведомлений соединения и разъединения

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

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

Перечисление 2-2 показывает один способ зарегистрироваться для этих уведомлений. (Код для обработки этих уведомлений показан в Уведомлениях Соединения и Разъединения Дескриптора.)

Перечисление 2-2  , Регистрирующееся для экранного соединения и уведомлений разъединения

- (void)setUpScreenConnectionNotificationHandlers
{
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
 
    [center addObserver:self selector:@selector(handleScreenDidConnectNotification:)
            name:UIScreenDidConnectNotification object:nil];
    [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:)
            name:UIScreenDidDisconnectNotification object:nil];
}
 

Соединение дескриптора и уведомления разъединения

Объект уведомления, который Вы получаете в своих пользовательских обработчиках уведомления, является объектом на экране, представляющим внешний дисплей. Когда Вы сделали при запуске приложения, необходимо определить границы нового экрана так, чтобы можно было создать и инициализировать окно корректного размера. Тогда установите окно screen свойство к новому объекту на экране и набору окно hidden свойство к NO, как показано в Перечислении 2-3.

  Соединение экрана Listing 2-3 Handling и уведомления разъединения

- (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;
 
    }
 
}

Разместите Атрибуты Внешнего дисплея, при необходимости

Много дисплеев поддерживают многократные разрешения, некоторые из которых используют различные попиксельные пропорции. A UIScreen возразите использует предпочтительный экранный режим дисплея по умолчанию и лучше использовать этот режим как можно больше. Можно вложить предпочтительный режим дисплея UIScreen объект preferredMode свойство.

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

В некоторых случаях Вы могли бы хотеть изменить экранный режим дисплея на тот, более подходящий для Вашего содержания прежде, чем связать Ваше окно с ним. Например, при реализации игры с помощью OpenGL, ES и текстуры разработаны для экрана на 640 x 480 пикселей, Вы могли бы изменить экранный режим для дисплеев с более высокими разрешениями по умолчанию. Перед изменением экранного режима удостоверьтесь, что пользовательский опыт все еще приемлем, если увеличено содержание.

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

Для получения дополнительной информации об экранных режимах, посмотрите Ссылку класса UIScreenMode.

В дополнение к включению экранного режима, a UIScreen объект включает overscanCompensation свойство можно использовать для приведения компенсации сверхсканирования в соответствие с внешним дисплеем, при необходимости. Сверхсканирование относится к практике, произошедшей с дисплеями электронно-лучевой трубки. Из-за технических ограничений старый CRTs отсканировал входящее изображение мимо краев трубки и вывел на экран кадрированное изображение. Несмотря на то, что ограничения были фиксированы, много вещательных компаний и производств дисплеев продолжают ожидать сверхсканировать. Используя значение по умолчанию overscanCompensation свойство — т.е. UIScreenOverscanCompensationScale— iOS масштабирует Ваше содержание соответственно, когда оно обнаруживает сверхсканирование во внешнем дисплее.

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