TL;DR
- 「拡大表示」設定を行うと論理的な解像度(
UIScreen.main.bounds
)が一段階小さくなる- iPhone 8は320x568になる
- 「拡大表示」設定になっていても
UIScreen.nativeBounds.width / UIScreen.main.scale
で拡大表示ではないときの解像度と同じ画面幅を取得できる
Device | bounds.width | nativeBounds.width | scale | nativeScale |
---|---|---|---|---|
8 | 375 | 750 | 2 | 2 |
8(拡大) | 320 | 750 | 2 | 2.34375 |
13 Pro | 390 | 1170 | 3 | 3 |
13 Pro(拡大) | 320 | 1170 | 3 | 3.65625 |
13 Pro Max | 428 | 1284 | 3 | 3 |
13 Pro Max(拡大) | 375 | 1170 | 3 | 3.424 |
「拡大表示」とは
iPhoneの 設定-画面表示と明るさ-拡大表示-表示-設定
から変更できるもの。
画面の表示内容が大きくなったように見える。
この設定を行うと論理的な解像度が一段階小さくなり、引き伸ばされて表示されるようになっている。
プログラム的には UIScreen.main.bounds
等の数値が小さくなっている。
例えばiPhone 8は375x667だが、「拡大表示」にすると320x568とiPhone SE(1st)と同じになる。
元々の解像度がほしいときは
nativeBounds
と scale
を用いる。
let originalWidth = UIScreen.nativeBounds.width / UIScreen.main.scale
let originalHeight = UIScreen.nativeBounds.height / UIScreen.main.scale
nativeBounds
ディスプレイの物理的解像度。iPhoneはHiDPIなので論理的解像度の倍の数値になっている
(iPhone 8なら750x667)
また画面が回転していても width
と height
が入れ替わらない。
scale
デフォルトの論理的解像度に対する物理的解像度の比。
(iPhone 8なら2)
scale
は「拡大表示」設定を行っていても変化しないため、「現在の論理的解像度に対する物理的解像度の比」を取得したい場合は nativeScale
を用いる。
Device | bounds.width | nativeBounds.width | scale | nativeScale |
---|---|---|---|---|
8 | 375 | 750 | 2 | 2 |
8(拡大) | 320 | 750 | 2 | 2.34375 |
13 Pro | 390 | 1170 | 3 | 3 |
13 Pro(拡大) | 320 | 1170 | 3 | 3.65625 |
13 Pro Max | 428 | 1284 | 3 | 3 |
13 Pro Max(拡大) | 375 | 1170 | 3 | 3.424 |