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. По сути, все, что происходит, - это уменьшение разрешения отображаемого содержимого, в то время как фактическое выходное разрешение остается неизменным.

0 ответов

Другие вопросы по тегам