iPhone Force настроить внешнее разрешение экрана
Рассматриваемое приложение должно позволять пользователю выбирать один из доступных режимов экрана выбранного дисплея. Например, внешний дисплей может изначально поддерживать 1920x1080, но его EDID также будет отображать поддерживаемые разрешения 1920x1200, 1280x720 и 1024x768.
По умолчанию подключенный внешний дисплей к устройству iOS всегда поддерживает самое высокое поддерживаемое разрешение для внешнего дисплея. Я позволил пользователю выбрать из списка UIScreenMode.availableModes
изменить разрешение. Как только режим выбран и применен к externalScreen.currentMode
Похоже, новая резолюция рассматривается.
При тестировании я назначил внешний вид дисплея, который весь красный. После изменения разрешения, например, с 1920x1080 до 1024x768, на мониторе отображается красное поле с соотношением сторон 4:3. Делая то же самое, но с разрешением 1280x720, остается красная рамка 16:9, которая заполняет экран почти так же, как 1080.
Однако красное поле содержит две метки с ограничениями AutoLayout. При изменении разрешения координаты меток x / y остаются теми же относительно красного поля. Они должны быть центрированы в красной рамке, но, похоже, они не меняются при изменении разрешения. Кроме того, физический размер меток увеличивается при уменьшении разрешения, что показывает, что изменение разрешения влияет на них.
Итак, как можно обновить подпредставления красного поля (UIView, назначенный для externalDisplay) после изменения UIScreenMode.currentMode
?
Ниже приведена упрощенная версия того, что происходит:
var externalScreen:UIScreen!
var externalWindow: UIWindow!
var extView: MyExternalDisplay?
func initializeExternalScreen(externalScreen:UIScreen) {
self.externalScreen = externalScreen
// Create a new window sized to the external screen's bounds
self.externalWindow = UIWindow(frame: self.externalScreen.bounds)
// Assign screen object to screen property of the new window
self.externalWindow.screen = externalScreen
// Load the clock view
let clockView = self.storyboard?.instantiateViewControllerWithIdentifier("ExternalDisplay") as! ExternalDisplay
clockView.view.frame = self.externalWindow.frame
// Add the view to the window
self.externalWindow.addSubview(clockView.view)
// Create a reference to the clockView
self.extView = clockView
// Make the window visible
self.externalWindow.makeKeyAndVisible()
}
func applyNewMode () {
let newMode = externalScreen.availableModes[1] // 1024x768
externalScreen.currentMode = newMode
}
Это вызывается при получении уведомления screenModeDidChange.
func handeScreenModeDidChangeNotification (notification:NSNotification) {
extView?.view.frame = externalWindow.frame
extView?.view.layoutSubviews()
}
ОБНОВИТЬ
Добавление следующего ответа на screenModeDidChange
кажется, что иногда уведомление решает проблему. Результаты противоречивы, и я не уверен, является ли это бета-версией iOS 9 или нет.
func handeScreenModeDidChangeNotification (notification:NSNotification) {
let screen = UIScreen.screens()[1]
initializeExternalScreen(screen)
}
ОБНОВЛЕНИЕ № 2
Хотя представляется возможным изменить разрешение внешнего экрана с помощью методов, перечисленных здесь, это не меняет фактическое выходное разрешение. Например, если устройство iOS подключено к монитору с предпочтительным EDID 1920x1080, устройство по умолчанию будет использовать это разрешение. Изменение разрешения с использованием ранее упомянутых методов приведет к изменению разрешения представленного изображения, но выходное разрешение останется 1920x1080. По сути, все, что происходит, - это уменьшение разрешения отображаемого содержимого, в то время как фактическое выходное разрешение остается неизменным.