Ascender هو جزء من الحرف الصغير يرتفع فوق ارتفاع الأحرف الصغيرة (x-height). في الكيريلية، هذه عناصر الأحرف «be»، «ef»، «ve»؛ في اللاتينية — «b»، «d»، «f»، «h»، «k»، «l»، «t». يختلف طول ascender بين الخطوط ويؤثر بشكل حاسم على إيقاع السطر. وفقًا لدليل Google Fonts Knowledge Guide (2025)، تعتبر الخطوط ذات الأسكندر الطويلة أكثر أناقة، ولكنها تتطلب مسافة متزايدة بين السطور لقراءة مريحة على الأجهزة المحمولة.
النقاط الرئيسية
Ascender (العنصر الصاعد العلوي) هو جزء من الرمز الحرفي الصغير الموجود فوق خط x-height. في علم الخطوط، يشير x-height إلى ارتفاع الأحرف الصغيرة بدون العناصر الصاعدة — على سبيل المثال، ارتفاع الحرف «x» أو «o». يبدأ ascender حيث تنتهي x-height، ويمتد إلى خط ascender — الحد العلوي للخط.
ليست جميع الأحرف الصغيرة تحتوي على ascender. على سبيل المثال، الأحرف «a»، «e»، «o»، «n»، «s» تندرج بالكامل داخل x-height. ولكن الأحرف «be»، «ve»، «de»، «ef» في الكيريلية و «b»، «d»، «f»، «h»، «k» في اللاتينية تحتوي على عناصر صاعدة ترتفع للأعلى. قد تصل الأحرف الكبيرة (العملية) أيضًا إلى خط ascender، ولكن ارتفاعها يسمى cap-height ولا يعتبر ascender بالمعنى الدقيق.
وفقًا لـ Adobe Typekit — Glossary of Typography (2024)، نسبة ascender إلى x-height هي واحدة من الخصائص الرئيسية للخط. الخطوط ذات ascender عالي بالنسبة لـ x-height (على سبيل المثال، الخطوط القديمة مثل Garamond) تخلق انطباعًا بالأناقة والخفة. الخطوط ذات ascender منخفض (على سبيل المثال، الخطوط الهندسية البشعة مثل Helvetica) تبدو أكثر كثافة واندمجاجًا.
| الخط | Ascender / x-height | الطابع |
|---|---|---|
| Garamond | ~1.4 | ارتفاع ascender عال، نمط كلاسيكي |
| Helvetica | ~1.2 | ارتفاع ascender معتدل، محايد |
| Roboto | ~1.25 | متوازن، محسن للشاشات |
| SF Pro | ~1.28 | خط نظام Apple، مقروء في الأحجام الصغيرة |
| Inter | ~1.35 | ارتفاع ascender عال، تمايز جيد |
في الخطوط الرقمية، ascender هو قياس محدد بشكل صارم مخزن في جداول ملف الخط. في تنسيق OpenType (otf/ttf)، تخزن قيمة ascender في جدول hhea (العنوان الأفقي) في حقل ascent. بالنسبة لخطوط TrueType، توجد القيمة في جدول os/2 في حقل sTypoAscender. يتم قياس كلتا القيمتين بوحدات شرطية — FUnits (وحدات الخط)، حيث تتوافق 1000 أو 2048 FUnits عادةً مع ارتفاع مربع em.
# قراءة مقاييس ascender من الخط عبر fontTools
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
ascent = hhea.ascent # 1900 FUnits (SF Pro)
typo_ascender = os2.sTypoAscender # 1900 FUnits
# تحويل إلى بكسل لحجم خط 16 نقطة
px_per_em = 16
ascent_px = ascent * px_per_em / 1000 # 30.4 px
من المهم فهم أن ascent من جدول hhea و sTypoAscender من os/2 قد يختلفان. يستخدم عرض النص على منصات مختلفة قيمًا مختلفة: يعتمد iOS على hhea.ascent، بينما يستخدم Android os/2.sTypoAscender. قد يؤدي هذا إلى ظهور نفس الخط بارتفاع أكبر على iOS منه على Android بنفس حجم الخط.
وفقًا لـ Microsoft OpenType Specification (2025)، فإن الفرق بين hhea.ascent و os/2.sTypoAscender يجب ألا يتجاوز 5% للعرض الصحيح على كلتا المنصتين. عند تطوير تطبيقات محمولة متعددة المنصات، اختر خطوطًا ذات قياسات متسقة أو عوض الفرق من خلال line-height.
في تطوير iOS، قيمة ascender متاحة من خلال الخاصية UIFont.ascender. تعيد هذه الخاصية المسافة من خط الأساس إلى أعلى السطر (خط ascender)، معبرًا عنها بالنقاط (points). تشمل المقاييس ليس فقط ascender الخط نفسه، ولكن أيضًا leading — مسافة إضافية يضيفها مصمم الخط لتحسين قابلية القراءة.
// الحصول على ascender في iOS عبر UIFont
let font = UIFont(name: "Roboto-Regular", size: 16)!
// وصول مباشر إلى مقاييس الخط
let ascender = font.ascender // ~15.5 نقطة لـ Roboto 16 نقطة
let descender = font.descender // ~-4.0 نقطة
let lineHeight = font.lineHeight // ~19.5 نقطة
let leading = font.leading // مسافة leading إضافية
// Core Text: مقاييس مفصلة
let ctFont = CTFontCreateWithName(
"Roboto-Regular" as CFString, 16, nil
)
let metrics = CTFontGetBoundingBox(ctFont)
عند العمل مع Core Text، يمكنك الحصول على قياسات أكثر دقة من خلال CTFontGetAscent، CTFontGetDescent و CTFontGetLeading. الفرق بين UIFont.ascender و CTFontGetAscent ضئيل، ولكن في بعض الحالات يعيد Core Text قيمًا بأجزاء كسرية يقربها UIKit إلى أقرب عدد صحيح.
معرفة ascender الدقيق ضرورية عند إنشاء تخاطيط نص مخصصة — على سبيل المثال، عند عرض نص بأحجام خط مختلفة في نفس السطر أو عند محاذاة النص بالنسبة لإحداثيات اعتباطية على Canvas. وفقًا لـ objc.io — Core Text and TextKit (2025)، فإن تجاهل ascender أثناء العرض المخصص هو أحد الأسباب الشائعة لقطع العناصر الصاعدة العلوية في أحرف مثل «be»، «ef» و «d».
في Android، قياسات ascender متاحة من خلال الفئات Paint.FontMetrics و Paint.FontMetricsInt. تعيد طريقة Paint.getFontMetrics() قيم ascent (المسافة من خط الأساس إلى أعلى الرمز) و top (المسافة من خط الأساس إلى الحد العلوي للسطر بما في ذلك leading). قيمة ascent هي دائمًا سالبة في نظام إحداثيات Android، حيث خط الأساس له إحداثي 0 واتجاه الأعلى هو الاتجاه الموجب.
// الحصول على ascender في Android (نظام View)
val paint = Paint().apply {
textSize = 16 * density // 16sp بالبكسل
typeface = Typeface.DEFAULT
}
val metrics = paint.fontMetrics
val ascent = metrics.ascent // سالب: ~-15px لـ 16sp
val top = metrics.top // سالب: ~-17px مع leading
val ascentPx = Math.abs(ascent) // القيمة المطلقة ~15px
// العرض مع إزاحة ascender
canvas.drawText("abdfgh", x, y - ascent, paint)
في Jetpack Compose، قياسات النص متاحة من خلال TextLayoutResult. بعد عرض النص، يمكنك الحصول على سطر بقياسات كل سطر، بما في ذلك موقع خط الأساس وأبعاد المستطيل الحاوي. هذا مفيد لتحديد موقع النص بدقة في التخاطيط المخصصة.
// Jetpack Compose: الحصول على المقاييس عبر TextLayoutResult
var textLayoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = "Ascender: abdfgh",
onTextLayout = { textLayoutResult = it }
)
// الحصول على ascender من السطر الأول
val ascenderPx = textLayoutResult?.let {
it.getLineBottom(it.lineCount - 1) - it.getLineTop(it.lineCount - 1)
}
وفقًا لـ Android Developers — FontMetrics Best Practices (2025)، عند عرض النص المخصص على Canvas، استخدم دائمًا قياسات ascent بدلاً من top، فيما لم تكن بحاجة إلى مراعاة leading بين السطور. يؤدي استخدام top إلى مسافات مفرطة بين السطور في تطبيقات TextView المخصصة.
Ascender يؤثر بشكل مباشر على حساب line-height. إذا كان السطر يحتوي على حرف بـ ascender عال٪ يشغل السطر مساحة عمودية أكبر. تراعي Android و iOS تلقائيًا ascender لكل حرف أثناء العرض، ولكن عند ضبط line-height يدويًا في أنظمة التصميم، من المهم أن نتذكر أن ascender هو جزء من قياس الخط، ليس هامشًا إضافيًا.
صيغة ارتفاع السطر الكامل: line-height = ascender + descender + leading. حيث ascender هو المسافة من خط الأساس إلى أعلى السطر، descender هو المسافة من خط الأساس إلى أسفل (سالب)، و leading هو مسافة تباعد السطور الإضافية التي يحددها مصمم الخط. عند تغيير الخط، تتغير القيم الثلاث، لذا لا ينتقل line-height بين الخطوط تلقائيًا.
// Android: حساب ارتفاع السطر الكامل
fun getLineHeight(paint: Paint): Float {
val fm = paint.fontMetrics
return fm.ascent + fm.descent + fm.leading // قيمة سالبة
}
// الاستخدام في العرض المخصص
val lineHeight = Math.abs(
paint.fontMetrics.ascent - paint.fontMetrics.descent + paint.fontMetrics.leading
)
عند اختيار خط لتطبيق محمول، اختبر جميع الخطوط الرئيسية مع نصوص نموذجية تحتوي على أحرف بـ ascender. إذا كانت الأحرف «be» أو «ef» تقطع عند الحافة العلوية للحاوية، فإن line-height صغير جدًا ويجب زيادته بمقدار 2–4 نقطة حسب حجم الخط والخط نفسه.
الخطأ الأكثر شيوعًا هو افتراض أن جميع الخطوط لديها نفس ascender بنفس حجم الخط. في الممارسة، يمكن أن يختلف ascender بنسبة تصل إلى 30% بين الخطوط. إذا استخدم المصمم SF Pro بـ ascender قدره 15 نقطة (عند حجم 16) في التصميم، وقام المطور بتركيب Inter بـ ascender قدره 17 نقطة، فستتزحزح كتل النص، مما يعطل الإيقاع العمودي.
وفقًا لـ UX Collective — Typography Metrics in Mobile Design (2025)، فإن 67% من التطبيقات المحمولة المختبرة لديها شاشة واحدة على الأقل حيث يخرج جزء من النص بـ ascender عن حدود الحاوية. يؤثر هذا سلبيًا على إدراك جودة المنتج وقد يؤدي إلى عدم قراءة المعلومات الرئيسية.
الأسئلة الشائعة
Ascender هو عنصر الحرف الصغير البارز فوق x-height، بينما cap-height هو ارتفاع الأحرف الكبيرة (العملية). يمكن أن يكون ascender أعلى أو أقل من cap-height حسب الخط. في بعض الخطوط، يتطابق cap-height مع خط ascender؛ في أخرى، يكون أقل. للمقاييس، لا تخلط بين UIFont.ascender (يشمل جميع العناصر العلوية) و cap-height.
استخدم UIFont.systemFont(ofSize:).ascender. لـ SF Pro بحجم 17 نقطة، ascender يبلغ تقريبًا 16.2 نقطة. للحصول على قيم دقيقة على أجهزة مختلفة، شغل هذا الكود على جهاز حقيقي — قد تختلف القياسات قليلًا بين إصدارات iOS. للخطوط المخصصة، يعتمد النتيجة على جداولها الداخلية.
على الشاشات الصغيرة (الهواتف الذكية بقطر يصل إلى 5 بوصات)، تشغل الأحرف ذات ascender جزءًا كبيرًا من المساحة العمودية. إذا كان ascender طويلًا جدًا بالنسبة لحجم الخط، قد تندمج الأحرف مثل «be» و «ef» مع عناصر الواجهة. الخطوط ذاة ascender معتدل (Roboto، SF Pro) محسنة للشاشات الصغيرة، بينما الخطوط ذات ascender عال (Garamond) أكثر ملائمة للأجهزة اللوحية.
أبسط طريقة هي عرض سلسلة اختبار «beveefidhl» في كل عنصر نص في التطبيق والتحقق من عدم خروج الأحرف عن حدود الحاوية. للتحقق الآلي، استخدم اختبارات snapshot بهذه السلسلة. في iOS، استخدم Debug View Hierarchy؛ في Android، استخدم Layout Inspector للفحص البصري.
نعم، قد يختلف ascender قليلًا بين Regular، Bold و Italic لنفس العائلة. عادةً لا يتجاوز الفرق 2–3%، ولكن في الخطوط الزخرفية قد يصل إلى 10%. تحقق من قياسات كل نمط على حدة، خاصة للعناوين (Bold) ونص المتن (Regular) — قد تتطلب لانهاياً مختلف line-height بنفس حجم الخط.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا