問題のアプリケーションでは、ユーザーが選択したディスプレイで使用可能な画面モードを 1 つ選択できる必要があります。たとえば、外部ディスプレイは 1920x1080 をネイティブにサポートしている場合がありますが、その EDID には 1920x1200、1280x720、および 1024x768 のサポートされている解像度も表示されます。
デフォルトでは、外部ディスプレイを iOS デバイスに接続すると、外部ディスプレイでサポートされている最高の解像度が常に優先されるように見えます。ユーザーがリストから選択してUIScreenMode.availableModes
解像度を変更できるようにしました。モードを選択して に適用するとexternalScreen.currentMode
、新しい解像度が考慮されていることが表示されます。
テストでは、すべて赤の外部ディスプレイにビューを割り当てました。たとえば、解像度を 1920x1080 から 1024x768 に変更すると、赤いボックスが 4:3 の縦横比でモニターに表示されます。同じことを 1280x720 にすると、赤いボックスが 16:9 に保たれ、1080 とほとんど同じように画面いっぱいになります。
ただし、赤いボックスには AutoLayout 制約のある 2 つのラベルが含まれています。解像度が変更されても、ラベルの x/y 座標は赤いボックスに対して同じままです。赤いボックスの中央に配置する必要がありますが、解像度を変更しても再レイアウトされないようです。さらに、解像度を下げると、ラベルの物理的なサイズが大きくなります。これは、解像度の変更によってラベルが何らかの影響を受けていることを示しています。
では、赤いボックスのサブビュー (externalDisplay に割り当てられた UIView) を変更した後、どのように更新でき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 デバイスが 1920x1080 の優先 EDID を示すモニターに接続されている場合、デバイスはデフォルトでこの解像度になります。前述の方法を使用して解像度を変更すると、表示される画像の解像度が変更されますが、出力解像度は 1920x1080 のままです。本質的に、実際の出力解像度は変更されずに、表示されるコンテンツの解像度が低下するだけです。