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-ом програмеру може бити потребна експлицитна конверзија у пикселе. Сва израчунавања анимација, детекција колизија и 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")
// Динамички тип — аутоматско скалирање
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 |
|---|---|---|
| Тип јединице | Логичка (независна од уређаја) | Физичка (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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође