iPhone强制调整外部屏幕分辨率

时间:2015-07-10 19:23:23

标签: ios swift screen-resolution swift2 uiscreen

有问题的应用程序必须允许用户选择一个所选显示器的可用屏幕模式。例如,外部显示器可能原生支持1920x1080但它的EDID也会显示支持的分辨率1920x1200,1280x720和1024x768。

默认情况下,将外接显示器连接到iOS设备似乎总是支持外接显示器支持的最高分辨率。我允许用户从UIScreenMode.availableModes列表中进行选择以更改分辨率。一旦选择了模式并应用于externalScreen.currentMode,它就会出现,正在考虑新的分辨率。

在测试中,我已经为外部显示器分配了一个全红色的视图。将分辨率从例如1920x1080更改为1024x768后,红色框将以4:3的宽高比显示在显示器上。做同样但1280x720保持红色框16:9填充屏幕与1080相同。

但是,红色框包含两个带有AutoLayout约束的标签。当分辨率改变时,标签的x / y坐标相对于红色框保持不变。它们应该位于红色框的中心,但是当分辨率更改时它们似乎不会重新布局。此外,当分辨率降低时,标签的物理尺寸会放大,这表明它们在某种程度上受到分辨率变化的影响。

那么,如何在更改UIScreenMode.currentMode之后更新红色框的子视图(分配给externalDisplay的UIView)?

以下是正在进行的简化版本:

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 个答案:

没有答案