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

Ios iPhone强制调整外部屏幕分辨率,ios,swift,screen-resolution,swift2,uiscreen,Ios,Swift,Screen Resolution,Swift2,Uiscreen,相关应用程序必须允许用户选择所选显示器的一种可用屏幕模式。例如,外部显示器可能本机支持1920x1080,但其EDID也将显示支持的分辨率1920x1200、1280x720和1024x768 默认情况下,将外部显示器连接到iOS设备似乎总是支持外部显示器支持的最高分辨率。我已允许用户从UIScreenMode.availableModes列表中选择以更改分辨率。一旦选择该模式并将其应用于externalScreen.currentMode,就会显示正在考虑新的分辨率 在测试中,我为外部显示器指

相关应用程序必须允许用户选择所选显示器的一种可用屏幕模式。例如,外部显示器可能本机支持1920x1080,但其EDID也将显示支持的分辨率1920x1200、1280x720和1024x768

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

在测试中,我为外部显示器指定了一个全红色的视图。将分辨率从例如1920x1080更改为1024x768后,红色框将以4:3的纵横比显示在监视器上。执行相同的操作,但将其设置为1280x720会使填充屏幕的红色框16:9与1080基本相同

但是,红色框包含两个带有自动布局约束的标签。分辨率更改时,标签的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
}
当接收到ScreenModedChange通知时调用此函数

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。本质上,所发生的一切都是显示内容的分辨率降低,而实际输出分辨率保持不变。

刚刚搜索了这个问题并发现了这个问题,我想指出文档明确指出,在将屏幕附加到窗口之前,您需要设置屏幕模式。这会不会以某种方式影响你的测试?顺便说一句,谢谢你给我一个指向相关参考文献的指针;在发现关键字UIScreenMode之前,我一直在兜圈子!