Descender — bu shriftning asosiy chizig‘i (baseline) dan pastga tushadigan kichik harf qismidir. Lotin alifbosida descender ga ega odatiy harflar “g”, “j”, “p”, “q”, “y” dir. Descender uzunligi shriftning pastki chiqish elementini belgilaydi va qator oralig‘ini hisoblash uchun juda muhimdir: baseline ostida yetarli joy bo‘lmasa, descender ga ega harflar keyingi qatorga tegib ketadi. Material Design Type Scale Guidelines (2025) ma’lumotlariga ko‘ra, descender ni yetarli darajada hisobga olmaslik mobil qurilmalardagi ko‘p qatorli matnda qatorlarning to‘qnashuvining asosiy sabablaridan biridir.
Asosiy fikrlar
Descender — bu baseline chizig‘i ostida joylashgan glif qismidir. Harfning asosiy tanasi baseline da tursa, descender undan tashqariga chiqib, shriftga xarakterli siluet beradi. Lotin shriftlarida “g”, “j”, “p”, “q”, “y” harflari pastki chiqish elementlariga ega.
Descender chuqurligi baseline dan glifning pastki chegarasigacha bo‘lgan masofani (descender-line) tavsiflaydi. Sifatli shriftlarda bu masofa muvozanatlangan: juda qisqa descender descender ga ega harflarni tanib bo‘lmas qiladi, juda uzuni esa qatorlar orasida ortiqcha bo‘sh joy yaratadi va matn zichligini pasaytiradi. Turli shrift garnituralari descender uzunligida sezilarli farqlarni namoyish etadi.
| Garnitura | Descender / em-size | Descender ga ega harflar namunasi |
|---|---|---|
| SF Pro | ~0.22 | g, p — muvozanatli chiqish |
| Roboto | ~0.24 | g, p — o‘rtacha descender |
| Playfair Display | ~0.30 | g, q — uzun dekorativ elementlar |
| Inter | ~0.26 | g, p — baseline dan sezilarli pastda |
| Noto Sans | ~0.20 | g — qisqa descender, ixcham |
Google Fonts Metrics Guide (2025) ga ko‘ra, descender chuqurligi to‘liq em hajmining (1000 FUnits) 20–25% ni tashkil qilganda optimal hisoblanadi. 15% dan past qiymatlar descender ga ega harflarni farqlashni qiyinlashtiradi, 30% dan yuqori qiymatlar esa qator to‘qnashuvlarini oldini olish uchun line height ni majburiy oshirishni talab qiladi.
Raqamli shriftlarda descender metrika jadvallarida manfiy qiymat sifatida saqlanadi. OpenType formatida bu hhea.descent (hhea jadvali) va sTypoDescender (OS/2 jadvali) maydonlaridir. Ikkala qiymat ham manfiy, chunki ular baseline dan pastga qarab o‘lchanadi. TrueType uchun OS/2 jadvali usWinDescent maydoni bilan ishlatiladi — uning qiymati musbat, ammo bir xil metrikani bildiradi.
# fontTools orqali shriftdan descender ni o‘qish
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
descent_hhea = hhea.descent # -500 FUnits (Roboto)
typo_descender = os2.sTypoDescender # -500 FUnits
win_descent = os2.usWinDescent # 500 (positive value)
# 16pt shrift o‘lchami uchun piksellarga aylantirish
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Platformalar orasidagi muhim farq: iOS renderlash uchun hhea.descent dan foydalanadi, Android esa OS/2 dan sTypoDescender ni ishlatadi. Agar bu qiymatlar farq qilsa (bu sifatsiz sozlangan shriftlarda uchraydi), bir xil matn iOS va Android da turli qator oralig‘i bilan ko‘rsatiladi. 100 FUnits farq (16 pt o‘lchamda taxminan 1.6 px) vizual tarzda seziladi.
Microsoft OpenType Specification v1.9 (2025) ga ko‘ra, to‘g‘ri platformalararo renderlash uchun hhea.descent va sTypoDescender qiymatlari 50 FUnits aniqligida teng bo‘lishi kerak. Mobil ilova uchun shrift tanlashda buni fontTools yoki shunga o‘xshash vosita orqali tekshirish zarur.
iOS da descender qiymati UIFont.descender xususiyati orqali mavjud. Bu xususiyat manfiy sonni qaytaradi, baseline dan shriftning pastki chegarasigacha bo‘lgan masofani (descender ni o‘z ichiga olgan holda) ko‘rsatadi. Masalan, 17 pt o‘lchamdagi SF Pro uchun descender qiymati taxminan -4.2 pt. Sonning moduli qanchalik katta bo‘lsa, shriftning pastki chiqish elementlari shunchalik uzun bo‘ladi.
// iOS da UIFont orqali descender ni olish
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt SF Pro 17pt uchun
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Descender ofseti bilan maxsus renderlash
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: descender bilan chegaralovchi qutini olish
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
TextKit (NSTextStorage, NSLayoutManager) dan foydalanganda, descender avtomatik ravishda lineFragmentPadding va lineFragmentRect da hisobga olinadi. Biroq Core Graphics (draw(in:)) orqali maxsus renderlashda koordinatalarni mustaqil ravishda sozlash, descender modulini konteynerning pastki chetiga qo‘shish kerak. Agar bajarilmasa, descender ga ega harflar renderlash chegarasidan chiqib ketadi va kesiladi.
Android da descender metrikalari Paint.FontMetrics.descent orqali mavjud. iOS dan farqli o‘laroq, descent qiymati musbat — bu baseline dan matnning pastki chegarasigacha bo‘lgan masofa. FontMetrics.bottom xususiyati nafaqat descender ni, balki shrift dizayneri tavsiya qilgan qo‘shimcha joyni (leading) ham o‘z ichiga oladi. Faqat descender ni aniq hisobga olish uchun bottom emas, balki descent dan foydalaning.
// Android da Paint orqali descender ni olish
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px 17sp uchun
val bottom = metrics.bottom // ~5.0 px leading bilan
// Descender ofseti bilan maxsus renderlash
val baseline = y
canvas.drawText("Namuna: gpq", x, baseline, paint)
// Descender bilan pastki chegara
val bottomBound = baseline + descent // to‘g‘ri pastki chegara
Jetpack Compose da descender TextLayoutResult orqali olinishi mumkin. getLineBottom metodi qatorning pastki chegarasining Y koordinatasini qaytaradi, u allaqachon descender ni o‘z ichiga oladi. Turli o‘lchamdagi qatorlarni (masalan, chegirmali narx va to‘liq narx) maxsus joylashtirishda descender ni hisobga olgan holda baseline bo‘yicha tekislash pastki chegara bo‘yicha tekislashdan ko‘ra aniqroq natija beradi.
// Compose: matn pastki chegarasini tekshirish
val text = "Text with descenders: gpq"
var layoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = text,
onTextLayout = { layoutResult = it },
modifier = Modifier.drawBehind {
layoutResult?.let { result ->
val lastLine = result.lineCount - 1
val bottom = result.getLineBottom(lastLine)
val top = result.getLineTop(lastLine)
// Descender konteyner chegarasidan oshmasligini tekshirish
}
}
)
Google Material Design — Typography Implementation (2025) ga ko‘ra, qattiq balandlikdagi konteynerlarda descender ning kesilishini oldini olish uchun joriy matnda descender ga ega harflar mavjudligidan qat’i nazar, shrift descent iga teng vertikal padding qo‘shish kerak. Bu matn dinamik almashtirilganda interfeys buzilmasligini kafolatlaydi.
Qator to‘qnashuvi (line collision) — bu yuqori qatordagi harfning descender i pastki qatordagi harfning ascender i bilan fizik kesishishi. Mobil interfeyslarda bu ayniqsa ko‘p qatorli sarlavhalar, mahsulot kartochkalari va kichik qator oralig‘idagi matn bloklarida seziladi. Muammo uzun descender li va kichik line height li shriftlarni ishlatishda kuchayadi.
To‘qnashuvlarni oldini oluvchi minimal line height quyidagi formula bo‘yicha hisoblanishi mumkin: line-height = ascender + descender + 2 px zaxira. 17 pt o‘lchamdagi SF Pro uchun bu taxminan 22.4 pt (koeffitsient ~1.32) line height beradi. 16 sp dagi Roboto uchun — taxminan 1.35. Agar line height bu qiymatdan kichik bo‘lsa, “g”, “j”, “p”, “q”, “y” harflarini o‘z ichiga olgan matnlarda to‘qnashuv kafolatlanadi.
// iOS: to‘qnashuvlarni oldini olish uchun minimal line-height ni hisoblash
let font = UIFont.systemFont(ofSize: 17)
let minLineHeight = abs(font.ascender) + abs(font.descender) + 2.0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = minLineHeight
paragraphStyle.maximumLineHeight = minLineHeight
let attributedText = NSAttributedString(
string: "Text with p on first line\nand y on second line",
attributes: [
.font: font,
.paragraphStyle: paragraphStyle
]
)
Dekorativ va qo‘l yozuvi shriftlari bilan ishlashda ayniqsa ehtiyot bo‘lish kerak — ularning descender i em hajmining 35–40% gacha yetishi mumkin. Bunday shriftlar asosiy matn uchun kam ishlatiladi, lekin sarlavhalarda qo‘llanishi mumkin. Hatto sarlavhadagi uzun descender li harfning bir marta paydo bo‘lishi interfeysning qo‘shni elementi bilan to‘qnashuvga sabab bo‘lishi mumkin.
Eng keng tarqalgan xato tugmalar va matn maydonlarida descender ning kesilishi dir. Tugma yoki matn maydoni balandligini descender ni hisobga olmasdan line height ga teng qilib qo‘yganimizda, descender ga ega harflar pastki chekkada kesiladi. Bu ayniqsa yumaloq burchakli tizim tugmalarida seziladi, bunda descender yumaloqlanish chegarasidan chiqib ketishi mumkin.
Nielsen Norman Group — Mobile Typography Research (2025) ma’lumotlariga ko‘ra, mobil ilovalarning 41% kamida bitta ekranga ega bo‘lib, unda descender li matn komponent chegarasidan chiqadi. Bu o‘qishlilikni 15% ga kamaytiradi va foydalanuvchi tomonidan vazifani bajarish vaqtini oshiradi. “g”, “j”, “p”, “q”, “y” harflarini o‘z ichiga olgan matn bilan muntazam test qilish bunday muammolarni rivojlanishning dastlabki bosqichlarida aniqlashga yordam beradi.
Tez-tez beriladigan savollar
Baseline — bu harflar turadigan gorizontal chiziq, descender esa harfning shu chiziq ostida joylashgan qismidir. Baseline qator uchun doimiy, descender esa ma’lum bir harfning xususiyatidir. Bu tushunchalarni aralashtirmang: baseline tekislash uchun ishlatiladi, descender esa qator oralig‘iga ta‘sir qiladi va konteyner balandligini belgilashda e‘tibor talab qiladi.
View tizimi uchun Paint.getFontMetrics().descent yoki Jetpack Compose da TextLayoutResult dan foydalaning. iOS dan farqli o‘laroq, Android da descent qiymati musbat va baseline dan glifning pastki chegarasigacha bo‘lgan masofani ko‘rsatadi. Qatorning to‘liq pastki chegarasini hisoblash uchun descent ni baseline ning Y koordinatasiga qo‘shing.
Platformalar shrift faylidan turli metrika jadvallarini ishlatadi: iOS — hhea.descent, Android — os/2.sTypoDescender. Agar shriftda bu qiymatlar farq qilsa, renderlash farq qiladi. Har doim ikkala qiymatni fontTools orqali tekshiring. Sifatli tizim shriftlari (SF Pro, Roboto, Noto) ikkala platforma uchun muvofiqlashtirilgan metrikalarga ega.
Minimal line-height = ascender + descender + 2 px zaxira. iOS da 17 pt tizim shrifti uchun bu taxminan 22.4 pt. Android da 16 sp Roboto uchun — taxminan 22 sp. Eng yaqin butun songa yaxlitlash va “gpq” test qatori bilan tekshirish tavsiya etiladi — agar to‘qnashuv bo‘lmasa, line height yetarli.
Ha, lekin shartlar bilan. Uzun descender li shriftlar (Playfair Display, dekorativ garnituralar) sarlavhalar va aksidens matn uchun joiz, bunda line height ni dizaynga zarar yetkazmasdan oshirish mumkin. Asosiy matn uchun em hajmining 20–25% descender ga ega shriftlar (SF Pro, Roboto, Inter) afzal, ortig‘cha vertikal joyni tejash uchun.
Xulosalar
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.