pt — какво е това, точки и мащабиране в iOS

Автор: IT Sectr Публикувано: 2026-02-25 Време за четене: 8 мин

pt — точки, логическа мерна единица в iOS и macOS, която абстрахира интерфейса от физическата резолюция на екрана. Един point съответства на един пиксел на екран без Retina (@1x) и на два или три пиксела на Retina (@2x, @3x). Статията обяснява принципа на работа на pt, мащабирането на различни екрани, използването на CGPoint и UIFont.pointSize.

Основно

  • pt — логическа точка iOS, независима от физическата резолюция на екрана
  • @1x, @2x, @3x — коефициент на мащаб, определящ колко пиксела се падат на една точка
  • CGPoint — структура за координати в pt, основа на всички операции за позициониране
  • UIFont.pointSize — размер на шрифта в точки, винаги се връща в pt
  • Разстояние от екрана: iPhone 15 Pro — 1 pt = 3 px при плътност на пикселите 460 PPI

Какво е pt в iOS?

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.

Коефициенти на мащаб: @1x, @2x, @3x

Коефициентът на мащаб (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 × 667750 × 1334@2x
iPhone 14390 × 8441170 × 2532@3x
iPhone 15 Pro Max430 × 9321290 × 2796@3x
iPad Pro 12.9"1024 × 13662048 × 2732@2x
iPad mini (6th gen)744 × 11331488 × 2266@2x

Стойността на scale factor е достъпна чрез UIScreen.main.scale (за UIKit) и @Environment(\.displayScale) (за SwiftUI). Използва се при зареждане на активи: системата автоматично избира изображението с наставка @2x или @3x от Assets.xcassets. Разработчикът не зарежда @1x изображения на устройства с Retina — това намалява производителността и качеството.

CGPoint и координати в точки

Структурата CGPoint — основният тип за представяне на координати в iOS и macOS. Съдържа две полета: x (CGFloat) и y (CGFloat), стойностите се задават в точки. CGPoint се използва във всички рамки на Apple: UIKit (frame.origin), Core Graphics (CGContext), SpriteKit (SKNode.position), Core Animation (CALayer.position).

swift
// 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 и типография

Свойството UIFont.pointSize връща размера на шрифта в точки — това е стандартната единица за типография в iOS, наследена от полиграфията (1 pt = 1/72 инча). Apple използва pt за шрифтове от първите версии на Mac OS. В iOS размерът на шрифта се задава в точки чрез UIFont.systemFont(ofSize:) или чрез SwiftUI Font.system(size:).

swift
// Работа с 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 vs px: разлики

Разликата между pt и px е критична за разбирането на iOS разработката. pt — логическа единица, px — физическа единица. Една точка може да отговаря на 1, 2 или 3 пиксела в зависимост от scale factor. Разработчикът работи с точки, системата ги преобразува в пиксели на етапа на растеризация.

Характеристикаptpx
Тип единицаЛогическа (независима от устройството)Физическа (хардуерен пиксел)
Зависи от резолюцияНеДа
Къде се използваUIKit, SwiftUI, Core Graphics, layoutИзображения, Metal, raw buffer
Конвертиране1 pt = scale × px (scale от 1 до 3)1 px = pt / scale
Пример (iPhone 15 Pro)393 × 852 pt1179 × 2556 px

Ключово следствие: размерът на интерфейса в точки е еднакъв на всички устройства от един клас. Екран с ширина 375 pt — това е както iPhone SE, така и iPhone 14 (базов модел). Разликата е само в това колко физически пиксела се побират в тези 375 pt. Това осигурява единен UI без ръчна адаптация за всяко устройство.

pt в SwiftUI

В SwiftUI разработчикът не работи изрично с точки — всички размери се задават чрез Dp (device-independent points, еквивалент на pt). SwiftUI автоматично прилага scale factor при рендиране, но предоставя достъп до него чрез environment value displayScale.

swift
// 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 и px?

pt — логическа точка iOS, независима от резолюцията на екрана. px — физически пиксел на дисплея. Една точка на iPhone 15 Pro е равна на три пиксела (@3x), на iPad Pro — на два (@2x). Разработчикът винаги работи с точки.

Как да разбера scale factor на устройството?

В UIKit: UIScreen.main.scale. В SwiftUI: @Environment(\.displayScale). Типични стойности: 1.0 (@1x), 2.0 (@2x), 3.0 (@3x). На iPhone 15 Pro Max стойността е 3.0.

Какъв размер на шрифта да използвам за body text?

Apple препоръчва 17 pt за основен текст (UIFontTextStyle.body). За заглавия — 28–34 pt. За надписи — 12–13 pt. Стиловете Dynamic Type автоматично се мащабират според настройките за достъпност на потребителя.

Какво е Dynamic Type в iOS?

Dynamic Type — система за автоматично мащабиране на шрифтове в iOS, представена в iOS 7. Позволява на текста да се адаптира към системните настройки за размер на шрифта (Text Size) и параметрите за достъпност (Bold Text, Larger Text). Реализира се чрез UIFontMetrics или стилове SwiftUI Font.

Трябва ли да създавам @1x активи за iOS?

Не. Съвременните устройства на Apple използват Retina дисплеи с @2x или @3x. @1x изображения са необходими само за съвместимост с iPad без Retina (iPad 2, iPad mini 1st gen). От iOS 13 нататък всички устройства поддържат поне @2x.

Обобщение

  • pt — логическа единица iOS, абстрахираща интерфейса от физическата резолюция и scale factor
  • @2x и @3x — коефициенти на мащаб за Retina дисплеи, определящи броя пиксели на точка
  • CGPoint — структура за координати в точки, основа на всички операции за позициониране в UIKit
  • UIFont.pointSize — размер на шрифта в точки с поддръжка на Dynamic Type чрез UIFontMetrics
  • SwiftUI напълно абстрахира pt, използвайки Font и Dynamic Type за автоматична адаптация
  • Активите за iOS трябва да се доставят в @2x и @3x, @1x не е необходим за съвременни устройства
  • Dynamic Type — задължителен механизъм за достъпност, автоматично мащабиращ шрифтовете за потребителя

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също