pt — points، وحدة قياس منطقية في iOS و macOS تجرد الواجهة من دقة الشاشة الفعلية. point واحد يقابل بكسل واحد على شاشة غير Retina (@1x) وبكسلين أو ثلاثة على Retina (@2x, @3x). تشرح المقالة مبدأ عمل pt، القياس على الشاشات المختلفة، استخدام CGPoint و UIFont.pointSize.
الرئيسية
pt (point) — وحدة قياس منطقية في iOS تتيح للمطور وصف الواجهة بإحداثيات مجردة، مستقلة عن دقة الشاشة الفعلية. قدمت Apple مفهوم النقاط مع إطلاق iPhone 4 وشاشة Retina في عام 2010. قبل Retina، كان المطورون يستخدمون البكسلات مباشرة — بكسل واجهة واحد يساوي بكسلًا فعليًا واحدًا.
نظام الإحداثيات في 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 (الجيل الثالث) | 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 (الجيل السادس) | 744 × 1133 | 1488 × 2266 | @2x |
قيمة عامل القياس متاحة عبر 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")
// 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 بكسلات حسب عامل القياس. المطور يتعامل بالنقاط، النظام يحولها إلى بكسلات في مرحلة التنقيط.
| الخاصية | pt | px |
|---|---|---|
| نوع الوحدة | منطقية (مستقلة عن الجهاز) | فعلية (بكسل الأجهزة) |
| تعتمد على الدقة | لا | نعم |
| أين تُستخدم | UIKit، SwiftUI، Core Graphics، التخطيط | الصور، Metal، raw buffer |
| التحويل | 1 pt = scale × px (القياس من 1 إلى 3) | 1 px = pt / scale |
| مثال (iPhone 15 Pro) | 393 × 852 pt | 1179 × 2556 px |
الاستنتاج الرئيسي: حجم الواجهة بالنقاط هو نفسه عبر جميع أجهزة الفئة نفسها. شاشة بعرض 375 pt — تنطبق على كل من iPhone SE و iPhone 14 (الموديل الأساسي). الفرق الوحيد هو عدد البكسلات الفعلية التي تتسع في هذه الـ 375 pt. هذا يضمن واجهة مستخدم موحدة دون تكييف يدوي لكل جهاز.
في SwiftUI، المطور لا يتعامل مع النقاط بشكل صريح — جميع الأحجام تُحدد عبر Dp (نقاط مستقلة عن الجهاز، تعادل pt). يطبق SwiftUI تلقائيًا عامل القياس أثناء التصيير لكنه يوفر الوصول إليه عبر قيمة البيئة displayScale.
// SwiftUI — العمل مع النقاط وعامل القياس
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("عامل القياس:")
.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 الجيل الأول). منذ iOS 13، جميع الأجهزة تدعم على الأقل @2x.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.