Descender је део малог слова који се спушта испод основне линије (baseline) фонта. У латиници типична слова са descender-ом су „g", „j", „p", „q", „y". Дужина descender-а одређује доњи излазни елемент фонта и критична је за израчунавање размака између редова: без довољно простора испод baseline, слова са descender-ом ће задирати у следећи ред. Према Material Design Type Scale Guidelines (2025), недовољно узимање у обзир descender-а је један од главних узрока колизије редова у вишередном тексту на мобилним уређајима.
Главно
Descender је део глифа који се налази испод линије baseline. Док главно тело слова стоји на baseline-у, descender се протеже изван њега, стварајући карактеристични силует фонта. У латиничним фонтовима, слова „g", „j", „p", „q", „y" имају доње излазне елементе.
Дубина descender-а описује растојање од baseline-а до доње границе глифа (descender-line). У квалитетним фонтовима ово растојање је уравнотежено: прекратак descender чини слова са descender-ом тешким за препознавање, а предугачак ствара прекомерни празан простор између редова и смањује густину текста. Различите гарнитуре фонта показују значајне разлике у дужини descender-а.
| Гарнитура | Descender / em-size | Пример слова са descender-ом |
|---|---|---|
| SF Pro | ~0.22 | g, p — уравнотежени излаз |
| Roboto | ~0.24 | g, p — умерени descender |
| Playfair Display | ~0.30 | g, q — дуги декоративни елементи |
| Inter | ~0.26 | g, p — приметно испод baseline-а |
| Noto Sans | ~0.20 | g — кратки descender, компактан |
Према Google Fonts Metrics Guide (2025), descender се сматра оптималним када његова дубина износи 20–25% од пуне величине em (1000 FUnits). Вредности испод 15% чине слова са descender-ом тешко разлучивим, а изнад 30% захтевају обавезно повећање line-height-а ради спречавања колизија редова.
У дигиталним фонтовима descender се чува као негативна вредност у табелама метрика. У OpenType формату то су поље hhea.descent (табела hhea) и sTypoDescender (табела OS/2). Обе вредности су негативне јер се мере од baseline-а наниже. За TrueType се користи табела OS/2 са пољем usWinDescent — његова вредност је позитивна, али означава исту метрику.
# Читање descender-а из фонта путем fontTools
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
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Критична разлика између платформи: iOS користи hhea.descent за рендеровање, а Android — sTypoDescender из OS/2. Ако се ове вредности разликују (што се дешава у неквалитетно подешеним фонтовима), исти текст ће се приказивати са различитим размацима између редова на iOS и Android. Разлика од 100 FUnits (приближно 1.6 px при величини 16 pt) већ је визуелно приметна.
Према Microsoft OpenType Specification v1.9 (2025), за коректно међуплатформско рендеровање, вредности hhea.descent и sTypoDescender треба да буду једнаке са прецизношћу од 50 FUnits. При избору фонта за мобилну апликацију, ово треба проверити путем fontTools-а или сличног алата.
У iOS вредност descender-а је доступна преко својства UIFont.descender. Ово својство враћа негативан број, показујући растојање од baseline-а до доње ивице фонта (укључујући descender). На пример, за SF Pro при величини 17 pt вредност descender-а износи приближно -4.2 pt. Што је модул броја већи, дужи су доњи излазни елементи фонта.
// Добијање descender-а на iOS-у путем UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt за SF Pro 17pt
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Прилагођено рендеровање са offset-ом descender-а
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: добијање граничног оквира са descender-ом
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
При коришћењу TextKit (NSTextStorage, NSLayoutManager), descender се аутоматски узима у обзир у lineFragmentPadding и lineFragmentRect. Међутим, при прилагођеном рендеровању путем Core Graphics (draw(in:)) потребно је самостално подесити координате, додајући модул descender-а доњем одстојању контејнера. Ако се то не уради, слова са descender-ом ће излазити из граница рендеровања и биће одсечена.
У Android метрике descender-а су доступне преко Paint.FontMetrics.descent. За разлику од iOS, вредност descent је позитивна — то је растојање од baseline-а до доње границе текста. Својство FontMetrics.bottom укључује не само descender, већ и додатни простор који препоручује дизајнер фонта (leading). За прецизно узимање у обзир само descender-а користите descent, а не bottom.
// Добијање descender-а на Android-у путем Paint
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px за 17sp
val bottom = metrics.bottom // ~5.0 px са leading-ом
// Прилагођено рендеровање са offset-ом descender-а
val baseline = y
canvas.drawText("Пример: gpq", x, baseline, paint)
// Доња граница са descender-ом
val bottomBound = baseline + descent // исправна доња граница
У Jetpack Compose descender се може добити путем TextLayoutResult. Метод getLineBottom враћа Y-координату доње границе реда, која већ укључује descender. При прилагођеном распореду редова са различитим величинама (нпр. цена са попустом и пуна цена), поравнање по baseline-у са узимањем у обзир descender-а даје прецизнији резултат од поравнања по доњој ивици.
// Compose: провера доње границе текста
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 не прелази границе контејнера
}
}
)
Према Google Material Design — Typography Implementation (2025), за спречавање одсецања descender-а у контејнерима са фиксном висином потребно је додати вертикални padding једнак најмање descent-у фонта, без обзира на присуство слова са descender-ом у тренутном тексту. Ово гарантује да се при динамичкој замени текста интерфејс неће покварити.
Колизија редова (line collision) — ситуација када descender слова горњег реда физички пресеца ascender слова доњег реда. У мобилним интерфејсима ово је посебно приметно у вишередним насловима, картицама производа и текстуалним блоковима са малим размаком између редова. Проблем се погоршава при коришћењу фонтова са дугим descender-има и малим line-height-ом.
Минимални line-height који спречава колизије може се израчунати по формули: line-height = ascender + descender + 2 px маргине. За SF Pro при величини 17 pt ово даје line-height од приближно 22.4 pt (коефицијент ~1.32). За Roboto при 16 sp — приближно 1.35. Ако је line-height мањи од ове вредности, колизије су загарантоване у текстовима који садрже слова из групе „g", „j", „p", „q", „y".
// iOS: израчунавање минималног line-height-а за спречавање колизија
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
]
)
Посебно пажљиви треба бити при раду са декоративним и рукописним фонтовима — њихов descender може достизати 35–40% од em-величине. Такви фонтови се ретко користе за главни текст, али могу се примењивати у насловима. Чак и појединачна појава слова са дугим descender-ом у наслову може изазвати колизију са суседним елементом интерфејса.
Најчешћа грешка је одсецање descender-а у дугмадима и текстуалним пољима. Када поставимо висину дугмета или текстуалног поља једнаком line-height-у, без узимања у обзир descender-а, слова са descender-ом се одсецају по доњој ивици. Ово је посебно приметно на системским дугмадима са заобљеним угловима, где descender може излазити ван границе заобљења.
Према Nielsen Norman Group — Mobile Typography Research (2025), 41% мобилних апликација има бар један екран на коме текст са descender-ом излази из граница компоненте. То доводи до смањења читљивости за 15% и повећања времена извршења задатка од стране корисника. Редовно тестирање са текстом који садржи слова „g", „j", „p", „q", „y" помаже у откривању оваквих проблема у раним фазама развоја.
Често постављана питања
Baseline је хоризонтална линија на којој стоје слова, а descender је део слова који се налази испод ове линије. Baseline је константа за ред, descender је својство одређеног слова. Немојте мешати ове појмове: baseline се користи за поравнање, а descender утиче на размак између редова и захтева пажњу при постављању висине контејнера.
Користите Paint.getFontMetrics().descent за View-систем или TextLayoutResult у Jetpack Compose. За разлику од iOS, вредност descent на Android-у је позитивна и показује растојање од baseline-а до доње границе глифа. За израчунавање пуне доње границе реда, додајте descent на Y-координату baseline-а.
Платформе користе различите табеле метрика из датотеке фонта: iOS — hhea.descent, Android — os/2.sTypoDescender. Ако се ове вредности у фонту разликују, рендеровање ће бити различито. Увек проверавајте обе вредности путем fontTools-а. Квалитетни системски фонтови (SF Pro, Roboto, Noto) имају усклађене метрике за обе платформе.
Минимални line-height = ascender + descender + 2 px маргине. За системски фонт 17 pt на iOS-у то је приближно 22.4 pt. На Android-у за 16 sp Roboto — приближно 22 sp. Препоручује се заокруживање на најближи цели број и провера са тест низом „gpq" — ако нема колизија, line-height је довољан.
Да, али са оградама. Фонтови са дугим descender-ом (Playfair Display, декоративне гарнитуре) прихватљиви су за наслове и акцидентни текст, где се line-height може повећати без штете по дизајн. За главни текст пожељни су фонтови са descender-ом од 20–25% од em-величине (SF Pro, Roboto, Inter) да се не би трошио непотребан вертикални простор.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође