В чем разница между размером экрана в пикселях и точках в iOS?
Что проверяют
Понимаете ли вы, что вёрстка в iOS живёт в логических единицах, а пиксели появляются только на этапе отрисовки. Следом часто спрашивают, откуда берутся размытые линии и зачем в каталоге ассетов слоты @2x и @3x.
Как отвечать
- точка (point): логическая единица, в которой задаются
frame, отступы, констрейнты и размеры шрифтов в UIKit и SwiftUI. Физический размер точки не фиксирован и зависит от устройства; - пиксель: физический элемент матрицы. Сколько пикселей приходится на точку, говорит масштаб:
traitCollection.displayScaleв UIKit или@Environment(\.displayScale)в SwiftUI. У современных iPhone это 2 или 3; - пример: у iPhone 15 Pro экран 393 × 852 точки и 1179 × 2556 пикселей, масштаб 3;
scaleиnativeScale: иногда различаются. На iPhone 6 Plus, 7 Plus и 8 Plus система рисует в 3x и ужимает картинку под физическую матрицу, режим увеличенного отображения тоже меняет соотношение;- изображения:
UIImage.sizeизмеряется в точках,cgImage.widthв пикселях. Растровые ассеты кладут в слоты @2x и @3x, иконки лучше отдавать векторными или брать из SF Symbols.
Практический вывод: верстать в точках, а о пикселях думать там, где важна чёткость. Линия толщиной в один физический пиксель это 1 / displayScale точки, а координаты, не попадающие на сетку пикселей, дают размытые края. UIScreen.main в новых версиях iOS помечен устаревшим, масштаб берут из трейтов конкретного окна или вью.
Где спотыкаются
Повторяют, что точка равна 1/72 дюйма. Это типографский пункт из полиграфии, к точке iOS он отношения не имеет: её физический размер разный на разных экранах.
Путают размер картинки при работе с UIGraphicsImageRenderer или CGImage и получают изображение втрое больше или втрое мельче, чем ожидали, потому что смешали точки с пикселями.
Рассказывают про 1x как про актуальный случай. Среди устройств, которые поддерживает текущая iOS, экранов без Retina нет, так что ассеты готовят под 2x и 3x.