pt — точки, логическа мерна единица в iOS и macOS, която абстрахира интерфейса от физическата резолюция на екрана. Един point съответства на един пиксел на екран без Retina (@1x) и на два или три пиксела на Retina (@2x, @3x). Статията обяснява принципа на работа на pt, мащабирането на различни екрани, използването на CGPoint и UIFont.pointSize.
Основно
pt (point) — логическа мерна единица в iOS, която позволява на разработчика да опише интерфейса в абстрактни координати, независими от физическата резолюция на дисплея. Apple въведе понятието point с пускането на 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 | Мащаб |
|---|---|---|---|
| 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 на разработчика може да му е необходимо изрично конвертиране в пиксели. Всички изчисления на анимации, откриване на сблъсъци и оформление се извършват в точки.
Свойството 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")
// Динамичен тип — автоматично мащабиране
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 |
|---|---|---|
| Тип единица | Логическа (независима от устройството) | Физическа (хардуерен пиксел) |
| Зависи от резолюция | Не | Да |
| Къде се използва | 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също