pt — points, логічна одиниця виміру в iOS і macOS, що абстрагує інтерфейс від фізичної роздільної здатності екрана. Один point відповідає одному пікселю на екрані без Retina (@1x) і двом або трьом пікселям на Retina (@2x, @3x). Стаття пояснює принцип роботи pt, масштабування на різних екранах, використання CGPoint і UIFont.pointSize.
Головне
pt (point) — логічна одиниця виміру в iOS, яка дозволяє розробнику описувати інтерфейс в абстрактних координатах, не залежних від фізичної роздільної здатності дисплея. Apple ввела поняття points з виходом iPhone 4 і Retina-дисплея в 2010 році. До Retina розробники використовували пікселі безпосередньо — один піксель UI дорівнював одному фізичному пікселю.
Система координат iOS побудована на точках: точка (0,0) знаходиться у верхньому лівому куті екрана, вісь X направлена вправо, вісь Y — вниз. Розмір екрана в точках залишається постійним для кожного класу пристроїв: iPhone SE — 375×667 pt, iPhone 15 Pro — 393×852 pt, iPad — 768×1024 pt (портрет), 1024×768 pt (ландшафт). Фізична роздільна здатність при цьому може бути 1179×2556 px (iPhone 15 Pro) — але розробник працює з точками.
За даними Apple Human Interface Guidelines, точки — фундаментальна абстракція UIKit. Всі фреймворки — UIKit, SwiftUI, Core Graphics, SpriteKit — оперують точками. Конвертація в пікселі відбувається автоматично на етапі рендерингу через UIScreen.nativeScale.
Коефіцієнт масштабу (scale factor) визначає, скільки фізичних пікселів відповідає одній логічній точці. Apple використовує три рівні: @1x — 1 pt = 1 px (iPad mini без Retina, старі моделі), @2x — 1 pt = 2 px (більшість iPhone до 2020 року, iPad Retina), @3x — 1 pt = 3 px (iPhone X і новіші, включаючи iPhone 15 Pro).
| Пристрій | Розмір в pt | Розмір в px | Scale |
|---|---|---|---|
| iPhone SE (3rd gen) | 375 × 667 | 750 × 1334 | @2x |
| iPhone 14 | 390 × 844 | 1170 × 2532 | @3x |
| iPhone 15 Pro Max | 430 × 932 | 1290 × 2796 | @3x |
| iPad Pro 12.9" | 1024 × 1366 | 2048 × 2732 | @2x |
| iPad mini (6th gen) | 744 × 1133 | 1488 × 2266 | @2x |
Значення scale factor доступне через UIScreen.main.scale (для UIKit) і @Environment(\.displayScale) (для SwiftUI). Використовується при завантаженні асетів: система автоматично вибирає зображення з суфіксом @2x або @3x з Assets.xcassets. Розробник не завантажує @1x-зображення на пристроях з Retina — це знижує продуктивність і якість.
Структура CGPoint — базовий тип для представлення координат в iOS і macOS. Містить два поля: x (CGFloat) і y (CGFloat), значення задаються в точках. CGPoint використовується у всіх фреймворках Apple: UIKit (frame.origin), Core Graphics (CGContext), SpriteKit (SKNode.position), Core Animation (CALayer.position).
// CGPoint — робота з координатами в точках
import UIKit
// Створення точки
let point = CGPoint(x: 100.0, y: 200.0)
print("Координати: \(point.x), \(point.y)")
// Математичні операції
let offset = CGPoint(x: 16.0, y: 8.0)
let translated = CGPoint(
x: point.x + offset.x,
y: point.y + offset.y
)
// Відстань між точками
func distance(from a: CGPoint, to b: CGPoint) -> CGFloat {
let dx = b.x - a.x
let dy = b.y - a.y
return sqrt(dx * dx + dy * dy)
}
// Перетворення точки в пікселі
extension CGPoint {
func toPixels(scale: CGFloat) -> CGPoint {
CGPoint(x: x * scale, y: y * scale)
}
}Метод toPixels в прикладі демонструє конвертацію точок у фізичні пікселі через UIScreen.main.scale. В UIKit ця конвертація відбувається автоматично при рендерингу, але в Core Graphics і при роботі з Metal розробнику може знадобитися явний перевід у пікселі. Всі розрахунки анімацій, collision detection і layout виконуються в точках.
Властивість UIFont.pointSize повертає розмір шрифту в точках — це стандартна одиниця типографіки в iOS, успадкована з поліграфії (1 pt = 1/72 дюйма). Apple використовує pt для шрифтів з перших версій Mac OS. В iOS розмір шрифту задається в точках через UIFont.systemFont(ofSize:) або через SwiftUI Font.system(size:).
// Робота з UIFont.pointSize в Swift
import UIKit
// Створення шрифту з розміром в pt
let titleFont = UIFont.systemFont(ofSize: 28.0, weight: .bold)
let bodyFont = UIFont.systemFont(ofSize: 17.0)
let captionFont = UIFont.systemFont(ofSize: 12.0)
// Читання pointSize
print("Розмір заголовка: \(titleFont.pointSize) pt")
// Dynamic Type — автоматичне масштабування
let scaledFont = UIFontMetrics.default.scaledFont(for: bodyFont)
print("Масштабований: \(scaledFont.pointSize) pt")
// Порівняння розмірів шрифтів
func font(from size: CGFloat, weight: UIFont.Weight) -> UIFont {
UIFont.systemFont(ofSize: size, weight: weight)
}UIFontMetrics — механізм динамічного масштабування шрифтів, доданий в iOS 11. Він автоматично коригує pointSize залежно від налаштувань доступності користувача (Settings > Display & Brightness > Text Size). Без використання UIFontMetrics шрифти не масштабуються, що порушує вимоги WCAG до доступності.
Різниця між pt і px критична для розуміння iOS-розробки. pt — логічна одиниця, px — фізична. Одна точка може відповідати 1, 2 або 3 пікселям залежно від scale factor. Розробник оперує точками, система перетворює їх у пікселі на етапі растеризації.
| Характеристика | pt | px |
|---|---|---|
| Тип одиниці | Логічна (device-independent) | Фізична (hardware pixel) |
| Залежить від роздільної здатності | Ні | Так |
| Де використовується | UIKit, SwiftUI, Core Graphics, layout | Зображення, Metal, raw buffer |
| Конвертація | 1 pt = scale × px (scale від 1 до 3) | 1 px = pt / scale |
| Приклад (iPhone 15 Pro) | 393 × 852 pt | 1179 × 2556 px |
Ключовий висновок: розмір інтерфейсу в точках однаковий на всіх пристроях одного класу. Екран 375 pt шириною — це і iPhone SE, і iPhone 14 (базова модель). Різниця тільки в тому, скільки фізичних пікселів вміщається в ці 375 pt. Це забезпечує єдинообразний UI без ручної адаптації під кожен пристрій.
В SwiftUI розробник не оперує точками явно — всі розміри задаються через Dp (device-independent points, еквівалент pt). SwiftUI автоматично застосовує scale factor при рендерингу, але надає доступ до нього через environment value displayScale.
// SwiftUI — робота з точками та scale factor
import SwiftUI
struct ContentView: View {
@Environment(\.displayScale) private var displayScale
var body: some View {
VStack(spacing: 16) {
Text("Заголовок")
.font(.system(size: 28, weight: .bold))
Text("Основний текст прикладу")
.font(.body)
HStack {
Text("Scale factor:")
.font(.caption)
Text("\(displayScale, specifier: "%.1f")")
.font(.caption.weight(.bold))
}
}
.padding(20)
.frame(width: 300)
}
}SwiftUI абстрагує pt на рівні фреймворку. .font(.body) автоматично використовує Dynamic Type — розмір шрифту підлаштовується під налаштування користувача. SwiftUI не дозволяє задати розмір шрифту в пікселях — тільки через Font і систему типографіки. Це гарантує доступність інтерфейсу без додаткових зусиль розробника.
Часті запитання
pt — логічна точка iOS, не залежна від роздільної здатності екрана. px — фізичний піксель дисплея. Одна точка на iPhone 15 Pro дорівнює трьом пікселям (@3x), на iPad Pro — двом (@2x). Розробник завжди оперує точками.
В UIKit: UIScreen.main.scale. В SwiftUI: @Environment(\.displayScale). Типові значення: 1.0 (@1x), 2.0 (@2x), 3.0 (@3x). На iPhone 15 Pro Max значення — 3.0.
Apple рекомендує 17 pt для основного тексту (UIFontTextStyle.body). Для заголовків — 28–34 pt. Для підписів — 12–13 pt. Стилі Dynamic Type автоматично масштабуються під налаштування доступності користувача.
Dynamic Type — система автоматичного масштабування шрифтів iOS, представлена в iOS 7. Дозволяє тексту адаптуватися під системні налаштування розміру шрифту (Text Size) і параметри доступності (Bold Text, Larger Text). Реалізується через UIFontMetrics або стилі SwiftUI Font.
Ні. Сучасні пристрої Apple використовують Retina-дисплеї з @2x або @3x. @1x зображення потрібні тільки для сумісності з iPad без Retina (iPad 2, iPad mini 1st gen). Починаючи з iOS 13, всі пристрої підтримують як мінімум @2x.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.