Descender ay ang bahagi ng maliit na letra na bumababa sa ilalim ng baseline ng font. Sa alpabetong Latin, ang karaniwang mga letra na may descender ay “g”, “j”, “p”, “q”, “y”. Ang haba ng descender ay tumutukoy sa pababang elemento ng font at kritikal para sa pagkalkula ng distansya ng linya: walang sapat na espasyo sa ilalim ng baseline, ang mga letrang may descender ay sasayad sa susunod na linya. Ayon sa Material Design Type Scale Guidelines (2025), ang hindi sapat na pagsasaalang-alang sa descender ay isa sa mga pangunahing sanhi ng banggaan (collision) ng mga linya sa multi-line na teksto sa mga mobile device.
Mga pangunahing punto
Descender ay ang bahagi ng glyph na nasa ilalim ng baseline. Habang ang pangunahing katawan ng letra ay nasa baseline, ang descender ay lumalampas dito, na lumilikha ng katangiang silweta ng font. Sa mga Latin na font, ang mga letrang “g”, “j”, “p”, “q”, “y” ay may mga pababang elemento.
Ang lalim ng descender ay naglalarawan ng distansya mula baseline hanggang sa ilalim na hangganan ng glyph (descender-line). Sa mga de-kalidad na font, ang distansyang ito ay balanse: ang masyadong maikling descender ay nagpapahirap makilala sa mga letrang may descender, at ang masyadong mahaba ay lumilikha ng labis na bakanteng espasyo sa pagitan ng mga linya at nagbabawas ng densidad ng teksto. Ang iba’t ibang pamilya ng font ay nagpapakita ng malaking pagkakaiba sa haba ng descender.
| Font | Descender / em-size | Halimbawang letra na may descender |
|---|---|---|
| SF Pro | ~0.22 | g, p — balanseng abot |
| Roboto | ~0.24 | g, p — katamtamang descender |
| Playfair Display | ~0.30 | g, q — mahabang pandekorasyon na elemento |
| Inter | ~0.26 | g, p — kapansin-pansin sa ilalim ng baseline |
| Noto Sans | ~0.20 | g — maikling descender, siksik |
Ayon sa Google Fonts Metrics Guide (2025), ang descender ay itinuturing na optimal kapag ang lalim nito ay 20–25% ng buong laki ng em (1000 FUnits). Ang mga halagang mas mababa sa 15% ay nagpapahirap sa pagkilala ng mga letrang may descender, at higit sa 30% ay nangangailangan ng sapilitang pagtaas ng line-height upang maiwasan ang banggaan ng linya.
Sa mga digital na font, ang descender ay nakaimbak bilang negatibong halaga sa mga talahanayan ng metrik. Sa OpenType format, ito ang field na hhea.descent (talahanayan hhea) at sTypoDescender (talahanayan OS/2). Ang parehong halaga ay negatibo dahil sinusukat mula baseline pababa. Para sa TrueType, ginagamit ang talahanayan OS/2 na may field na usWinDescent — positibo ang halaga nito ngunit tumutukoy sa parehong metrik.
# Pagbasa ng descender mula sa font sa pamamagitan ng 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)
# Conversion sa pixels para sa laki ng font na 16pt
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Ang kritikal na pagkakaiba sa pagitan ng mga platform: Ang iOS ay gumagamit ng hhea.descent para sa rendering, at Android — sTypoDescender mula sa OS/2. Kung magkaiba ang mga halagang ito (na nangyayari sa hindi maayos na pagkaka-configure na font), ang parehong teksto ay ipapakita na may magkaibang distansya ng linya sa iOS at Android. Ang pagkakaiba ng 100 FUnits (humigit-kumulang 1.6 px sa laki ng 16 pt) ay nakikita na.
Ayon sa Microsoft OpenType Specification v1.9 (2025), para sa tamang cross-platform rendering, ang mga halaga ng hhea.descent at sTypoDescender ay dapat pantay na may katumpakan na 50 FUnits. Kapag pumipili ng font para sa mobile app, ito ay dapat suriin sa pamamagitan ng fontTools o katulad na utility.
Sa iOS, ang halaga ng descender ay makukuha sa pamamagitan ng property na UIFont.descender. Ang property na ito ay nagbabalik ng negatibong numero na nagpapakita ng distansya mula baseline hanggang sa ilalim na gilid ng font (kabilang ang descender). Halimbawa, para sa SF Pro sa laki ng 17 pt, ang halaga ng descender ay humigit-kumulang -4.2 pt. Kung mas malaki ang absolute value, mas mahaba ang pababang elemento ng font.
// Pagkuha ng descender sa iOS sa pamamagitan ng UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt para sa SF Pro 17pt
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Custom na rendering na may descender offset
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: pagkuha ng bounding box na may descender
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
Kapag gumagamit ng TextKit (NSTextStorage, NSLayoutManager), ang descender ay awtomatikong isinasaalang-alang sa lineFragmentPadding at lineFragmentRect. Gayunpaman, sa custom na rendering sa pamamagitan ng Core Graphics (draw(in:)), kailangan mong independiyenteng ayusin ang mga coordinate sa pamamagitan ng pagdaragdag ng absolute value ng descender sa ilalim na margin ng container. Kung hindi ito gagawin, ang mga letrang may descender ay lalabas sa hangganan ng rendering at mapuputol.
Sa Android, ang metrik ng descender ay makukuha sa pamamagitan ng Paint.FontMetrics.descent. Hindi tulad ng iOS, ang halaga ng descent ay positibo — ito ang distansya mula baseline hanggang sa ilalim na hangganan ng teksto. Ang property na FontMetrics.bottom ay hindi lamang kasama ang descender, kundi pati na rin ang karagdagang espasyo na inirerekomenda ng taga-disenyo ng font (leading). Para tumpak na isaalang-alang lamang ang descender, gamitin ang descent, hindi ang bottom.
// Pagkuha ng descender sa Android sa pamamagitan ng Paint
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px para sa 17sp
val bottom = metrics.bottom // ~5.0 px na may leading
// Custom na rendering na may descender offset
val baseline = y
canvas.drawText("Halimbawa: gpq", x, baseline, paint)
// Ilalim na hangganan na may descender
val bottomBound = baseline + descent // tamang ilalim na hangganan
Sa Jetpack Compose, ang descender ay maaaring makuha sa pamamagitan ng TextLayoutResult. Ang pamamaraang getLineBottom ay nagbabalik ng Y-coordinate ng ilalim na hangganan ng linya, na kasama na ang descender. Sa custom na layout ng mga linya na may magkaibang laki (hal., may diskwentong presyo at buong presyo), ang pagkakapantay sa baseline na isinasaalang-alang ang descender ay nagbibigay ng mas tumpak na resulta kaysa sa pagkakapantay sa ilalim na gilid.
// Compose: pagsusuri ng ilalim na hangganan ng teksto
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)
// Suriin na ang descender ay hindi lumalampas sa hangganan ng container
}
}
)
Ayon sa Google Material Design — Typography Implementation (2025), upang maiwasan ang pagputol ng descender sa mga container na may takdang taas, kailangang magdagdag ng vertical padding na hindi bababa sa descent ng font, anuman ang pagkakaroon ng mga letrang may descender sa kasalukuyang teksto. Ito ay ginagarantiya na sa dinamikong pagpapalit ng teksto, ang interface ay hindi masisira.
Banggaan ng linya (line collision) — sitwasyon kung saan ang descender ng letra sa itaas na linya ay pisikal na sumasalubong sa ascender ng letra sa ilalim na linya. Sa mga mobile interface, ito ay lalong kapansin-pansin sa multi-line na mga heading, card ng produkto, at mga text block na may maliit na distansya ng linya. Ang problema ay pinalala sa paggamit ng mga font na may mahabang descender at maliit na line-height.
Ang minimum na line-height na pumipigil sa banggaan ay maaaring kalkulahin gamit ang pormula: line-height = ascender + descender + 2 px reserve. Para sa SF Pro sa laki ng 17 pt, ito ay nagbibigay ng line-height na humigit-kumulang 22.4 pt (coefficient ~1.32). Para sa Roboto sa 16 sp — humigit-kumulang 1.35. Kung ang line-height ay mas mababa sa halagang ito, garantisado ang banggaan sa mga tekstong naglalaman ng mga letra mula sa grupong “g”, “j”, “p”, “q”, “y”.
// iOS: kalkulahin ang minimum na line-height upang maiwasan ang banggaan
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
]
)
Kailangang maging maingat lalo na kapag nagtatrabaho sa mga pandekorasyon at sulat-kamay na font — ang kanilang descender ay maaaring umabot ng 35–40% ng laki ng em. Ang ganitong mga font ay bihirang ginagamit para sa pangunahing teksto, ngunit maaaring ilapat sa mga heading. Kahit na ang isang beses na paglitaw ng letrang may mahabang descender sa isang heading ay maaaring magdulot ng banggaan sa katabing elemento ng interface.
Ang pinakakaraniwang pagkakamali ay pagputol ng descender sa mga button at text field. Kapag itinakda natin ang taas ng button o text field na katumbas ng line-height, nang hindi isinasaalang-alang ang descender, ang mga letrang may descender ay napuputol sa ilalim na gilid. Ito ay lalong kapansin-pansin sa mga system button na may bilugan na sulok, kung saan ang descender ay maaaring lumampas sa hangganan ng bilog.
Ayon sa Nielsen Norman Group — Mobile Typography Research (2025), 41% ng mga mobile app ay may hindi bababa sa isang screen kung saan ang teksto na may descender ay lumalampas sa hangganan ng component. Ito ay humahantong sa pagbawas ng pagiging nababasa ng 15% at pagtaas ng oras ng pagtapos ng gawain ng gumagamit. Ang regular na pagsubok na may tekstong naglalaman ng mga letrang “g”, “j”, “p”, “q”, “y” ay tumutulong upang matukoy ang mga problemang ito sa maagang yugto ng pag-develop.
Mga madalas itanong
Baseline ay ang pahalang na linya kung saan nakatayo ang mga letra, habang ang descender ay ang bahagi ng letra na nasa ilalim ng linyang ito. Ang baseline ay isang constant para sa isang linya, ang descender ay isang property ng isang partikular na letra. Huwag paghaluin ang mga konseptong ito: ang baseline ay ginagamit para sa pagkakapantay, habang ang descender ay nakakaapekto sa distansya ng linya at nangangailangan ng pansin kapag itinatakda ang taas ng container.
Gamitin ang Paint.getFontMetrics().descent para sa View-system o TextLayoutResult sa Jetpack Compose. Hindi tulad ng iOS, ang halaga ng descent sa Android ay positibo at nagpapakita ng distansya mula baseline hanggang sa ilalim na hangganan ng glyph. Upang kalkulahin ang buong ilalim na hangganan ng linya, idagdag ang descent sa Y-coordinate ng baseline.
Ang mga platform ay gumagamit ng magkaibang talahanayan ng metrik mula sa file ng font: iOS — hhea.descent, Android — os/2.sTypoDescender. Kung ang mga halagang ito sa font ay magkaiba, ang rendering ay mag-iiba. Palaging suriin ang parehong halaga sa pamamagitan ng fontTools. Ang mga de-kalidad na system font (SF Pro, Roboto, Noto) ay may pare-parehong metrik para sa parehong platform.
Minimum na line-height = ascender + descender + 2 px reserve. Para sa system font na 17 pt sa iOS, ito ay humigit-kumulang 22.4 pt. Sa Android para sa 16 sp Roboto — humigit-kumulang 22 sp. Inirerekomenda ang pag-round sa pinakamalapit na buong numero at pagsusuri gamit ang test string na “gpq” — kung walang banggaan, sapat ang line-height.
Oo, ngunit may kondisyon. Ang mga font na may mahabang descender (Playfair Display, pandekorasyon na font) ay katanggap-tanggap para sa mga heading at aksidenteng teksto, kung saan ang line-height ay maaaring taasan nang hindi nasisira ang disenyo. Para sa pangunahing teksto, ang mga font na may descender na 20–25% ng laki ng em (SF Pro, Roboto, Inter) ay mas gusto upang makatipid ng hindi kinakailangang vertical space.
Mga konklusyon
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din