Airplay: зеркальное отображение на внешнем окне
Дизайн / архитектурный вопрос по трансляции. Я настроил внешний дисплей в AppDelegate:
UIScreen *externalScreen = UIScreen.screens.lastObject;
self.externalWindow = [[UIWindow alloc] initWithFrame:externalScreenFrame];
self.externalWindow.screen = externalScreen;
self.externalWindow.backgroundColor = [UIColor redColor];
Работает нормально, телевизор показывает пустой экран красным цветом. Теперь у меня есть ViewController с кучей подпредставлений, и один вид должен отображаться на устройстве и на внешнем экране. Если я попробую это в ViewController.m:
[_appDelegate.externalWindow addSubview:self.deviceAndTVView];
deviceAndTVView будет отображаться только на внешнем экране, а не на устройстве. То, что мне нужно, это иметь deviceAndTVView на устройстве, обновляя себя при касаниях / взаимодействии с пользователем, и отражать эти обновления на внешнем экране.
Какой правильный путь для этого?
Спасибо за прочтение! м
2 ответа
Технология, называемая зеркалированием AirPlay, слабо названа. На самом деле он работает в двух режимах, в одном из которых все устройство iOS зеркально отображается на устройстве AirPlay, а в другом режиме, когда после подключения зеркального устройства AirPlay, у разработчика есть два UIWindow/UIScreen для работы.
Вы используете последний режим, который часто называют "зеркальным отображением", но на самом деле у вас есть совершенно отдельное окно / экран для управления, и должна быть лучшая терминология для обозначения этого режима работы.
То, что вы описали, делая выше, в основном перемещает UIView из окна устройства в окно AirPlay, и оно работает точно так, как должно!
У вас нет технического способа иметь один экземпляр шоу UIView в обоих этих окнах - он будет существовать в одной иерархии UIView или в другой, но не в обоих одновременно. Другими словами, если вы хотите, чтобы одна и та же вещь отображалась на обоих экранах, вам нужно создать два экземпляра одного и того же UIView и добавить их соответственно в два окна, а затем обновить оба из них по мере их изменения.
Хотя это может быть не очень удобное "зеркальное отображение", которое вы ожидали, вероятно, это будет хорошо, потому что ваш UIView может иметь другое соотношение сторон на устройстве, чем на устройстве AirPlay. Имея два разных представления с одним и тем же контентом, вы можете настроить размер представления AirPlay, чтобы наилучшим образом использовать доступное разрешение устройства.
Я могу придумать пару способов сделать это. Вы смотрели на использование KVO для этого? Как локальные, так и внешние виды могут наблюдать за тем, какая модель или контроллер управляет их контентом.