Ios iPhone强制调整外部屏幕分辨率
相关应用程序必须允许用户选择所选显示器的一种可用屏幕模式。例如,外部显示器可能本机支持1920x1080,但其EDID也将显示支持的分辨率1920x1200、1280x720和1024x768 默认情况下,将外部显示器连接到iOS设备似乎总是支持外部显示器支持的最高分辨率。我已允许用户从UIScreenMode.availableModes列表中选择以更改分辨率。一旦选择该模式并将其应用于externalScreen.currentMode,就会显示正在考虑新的分辨率 在测试中,我为外部显示器指定了一个全红色的视图。将分辨率从例如1920x1080更改为1024x768后,红色框将以4:3的纵横比显示在监视器上。执行相同的操作,但将其设置为1280x720会使填充屏幕的红色框16:9与1080基本相同 但是,红色框包含两个带有自动布局约束的标签。分辨率更改时,标签的x/y坐标相对于红色框保持不变。它们应该在红色框中居中,但当分辨率更改时,它们似乎不会重新布局。此外,当分辨率降低时,标签的物理大小会增大,这表明它们在某种程度上受到分辨率更改的影响 那么,在更改UIScreenMode.currentMode后,如何更新分配给externalDisplay的红框UIView的子视图 下面是正在发生的事情的简化版本:Ios iPhone强制调整外部屏幕分辨率,ios,swift,screen-resolution,swift2,uiscreen,Ios,Swift,Screen Resolution,Swift2,Uiscreen,相关应用程序必须允许用户选择所选显示器的一种可用屏幕模式。例如,外部显示器可能本机支持1920x1080,但其EDID也将显示支持的分辨率1920x1200、1280x720和1024x768 默认情况下,将外部显示器连接到iOS设备似乎总是支持外部显示器支持的最高分辨率。我已允许用户从UIScreenMode.availableModes列表中选择以更改分辨率。一旦选择该模式并将其应用于externalScreen.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
}
当接收到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之前,我一直在兜圈子!