Реальное разрешение экрана iPhone XR отличается от разрешения экрана, заданного Swift?
Разрешение экрана iPhone XR в соответствии со скриншотами, веб-сайт Apple и т.д.:
828x1792
Разрешение экрана iPhone XR по Swift:
375x812 (или 750x1624)
Почему и как с этим бороться?!
ПРИМЕЧАНИЕ: все iphone Xx работают правильно, кроме этого - iphone XR (+iphone XR simulator)
4 ответа
Существует два разных понятия: размер UIKit и собственное разрешение.
Размер UIKit представлен точками и используется при позиционировании представлений внутри вашего проекта. Допустим, ваш экран имеет размер 414x896 точек, и вы центрируете свой вид в положение [207,448], ваш вид будет в центре экрана.
Собственное разрешение представлено пикселями, и оно показывает, сколько пикселей имеет экран устройства. Вы можете получить собственное разрешение устройства, умножив размер UIKit на коэффициент Native Scale, который индивидуален для каждого устройства.
Я создал таблицу для этих размеров, коэффициентов масштабирования и разрешения для всех iPhone, которые поддерживают iOS 12
iPhone | UIKit size (points) | Native resolution (pixels) | Native Scale factor
-------------|---------------------|----------------------------|--------------------
Xs Max | 414x896 | 1242x2688 | 3
X, Xs | 375x812 | 1125x2436 | 3
Xr | 414x896 | 828x1792 | 2
6+,6s+,7+,8+ | 414x736 | 1080x1920 | 2.608
6,6s,7,8 | 375x667 | 750x1334 | 2
5s,SE | 320x568 | 640x1136 | 2
... из этой таблицы вы можете видеть, что ваш iPhone Xr имеет размер UIKit 414x896, а не 375x812, как написано в вашем вопросе.
Вы можете получить размер UIKit устройства, получая границы экрана
UIScreen.main.bounds
и родное разрешение, получая родные границы
UIScreen.main.nativeBounds
... каждый из них хорошо работает для iPhone Xr, поэтому проверьте еще раз, выполняете ли вы свой код на iPhone Xr, а не на iPhone Xs/X, который имеет размер UIKit 375x812. Кроме того, этот 750x1624 - это просто какая-то странная шкала родного разрешения Xr, так что проверьте, не занимаетесь ли вы дополнительной математикой.
Это связано с тем, что на вашем iPhone XR включена функция "Показать масштаб".
Настройки -> Дисплей и яркость -> Масштаб дисплея -> Установить на Стандарт
Существует разница между физическим размером экрана и размером UIKit (пиксели против точек).
UIKit использует точки, точка может состоять из нескольких пикселей (это где @2x, @3x).
Основное различие между XR и другими устройствами X состоит в том, что XR использует @ 2x, а другие устройства - @3x.
Вот документы Apple по этому вопросу: https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html
PaintCode также сделал очень удобную графику, чтобы проиллюстрировать это:
https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
РЕДАКТИРОВАТЬ, чтобы ответить на комментарий Rmaddy.
Если раскадровка настроена так, чтобы показывать iPhone X, то это размер, который будет возвращаться до тех пор, пока представления не будут выложены.
Вы получаете разрешение iphone X, и это происходит, скорее всего, потому, что вы используете iphone X в раскадровке. Код сначала дает вам разрешение раскадровки. Если вы хотите получить реальный размер, вызовите метод layoutIfNeeded() перед кодом, который использует разрешение