pt — σημεία, λογική μονάδα μέτρησης σε iOS και macOS, η οποία αφαιρεί τη διεπαφή από τη φυσική ανάλυση της οθόνης. Ένα point αντιστοιχεί σε ένα pixel σε οθόνη χωρίς Retina (@1x) και σε δύο ή τρία pixel σε Retina (@2x, @3x). Το άρθρο εξηγεί την αρχή λειτουργίας του pt, την κλιμάκωση σε διαφορετικές οθόνες, τη χρήση CGPoint και UIFont.pointSize.
Κύρια
pt (point) — λογική μονάδα μέτρησης στο iOS που επιτρέπει στον προγραμματιστή να περιγράφει τη διεπαφή σε αφηρημένες συντεταγμένες, ανεξάρτητες από τη φυσική ανάλυση της οθόνης. Η Apple εισήγαγε την έννοια του point με την κυκλοφορία του iPhone 4 και της οθόνης Retina το 2010. Πριν από το Retina, οι προγραμματιστές χρησιμοποιούσαν απευθείας pixel — ένα UI pixel ήταν ίσο με ένα φυσικό pixel.
Το σύστημα συντεταγμένων του 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 — λειτουργούν με σημεία. Η μετατροπή σε pixel γίνεται αυτόματα στο στάδιο της απόδοσης μέσω UIScreen.nativeScale.
Ο συντελεστής κλίμακας (scale factor) καθορίζει πόσα φυσικά pixel αντιστοιχούν σε ένα λογικό σημείο. Η 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)
}
// Μετατροπή σημείου σε pixel
extension CGPoint {
func toPixels(scale: CGFloat) -> CGPoint {
CGPoint(x: x * scale, y: y * scale)
}
}Η μέθοδος toPixels στο παράδειγμα παρουσιάζει τη μετατροπή σημείων σε φυσικά pixel μέσω του UIScreen.main.scale. Στο UIKit αυτή η μετατροπή γίνεται αυτόματα κατά την απόδοση, αλλά στο Core Graphics και κατά την εργασία με Metal, ο προγραμματιστής μπορεί να χρειαστεί ρητή μετατροπή σε pixel. Όλοι οι υπολογισμοί κινούμενων σχεδίων, ανίχνευσης συγκρούσεων και διάταξης εκτελούνται σε σημεία.
Η ιδιότητα 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 pixel ανάλογα με το scale factor. Ο προγραμματιστής λειτουργεί με σημεία, το σύστημα τα μετατρέπει σε pixel στο στάδιο της ραστεροποίησης.
| Χαρακτηριστικό | 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 (βασικό μοντέλο). Η διαφορά είναι μόνο στο πόσα φυσικά pixel χωρούν σε αυτά τα 375 pt. Αυτό εξασφαλίζει ομοιόμορφη διεπαφή χωρίς χειροκίνητη προσαρμογή για κάθε συσκευή.
Στο 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 δεν επιτρέπει τον ορισμό μεγέθους γραμματοσειράς σε pixel — μόνο μέσω Font και του συστήματος τυπογραφίας. Αυτό εγγυάται την προσβασιμότητα της διεπαφής χωρίς πρόσθετη προσπάθεια από τον προγραμματιστή.
Συχνές Ερωτήσεις
pt — λογικό σημείο iOS, ανεξάρτητο από την ανάλυση οθόνης. px — φυσικό pixel της οθόνης. Ένα σημείο στο iPhone 15 Pro ισούται με τρία pixel (@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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης