Descender är den del av en gemen bokstav som sträcker sig under typsnittets baslinje (baseline). I det latinska alfabetet är typiska bokstäver med descender “g”, “j”, “p”, “q”, “y”. Descenderns längd bestämmer typsnittets nedre utstick och är kritisk för beräkning av radavstånd: utan tillräckligt utrymme under baseline kommer bokstäver med descender att tangera nästa rad. Enligt Material Design Type Scale Guidelines (2025) är otillräcklig hänsyn till descender en av huvudorsakerna till kollision av rader i flerradig text på mobila enheter.
Huvudpunkter
Descender är den del av en glyf som befinner sig under baseline. Medan bokstavens huvudkropp står på baseline sträcker sig descender bortom den och skapar typsnittets karakteristiska silhuett. I latinska typsnitt har bokstäverna “g”, “j”, “p”, “q”, “y” nedre utstick.
Descenderns djup beskriver avståndet från baseline till glyfens nedre gräns (descender-line). I kvalitativa typsnitt är detta avstånd balanserat: en för kort descender gör bokstäver med descender svåra att känna igen, medan en för lång skapar överdrivet tomrum mellan raderna och minskar textens densitet. Olika typsnittsfamiljer uppvisar betydande skillnader i descenderns längd.
| Typsnitt | Descender / em-size | Exempel på bokstäver med descender |
|---|---|---|
| SF Pro | ~0.22 | g, p — balanserat utstick |
| Roboto | ~0.24 | g, p — måttlig descender |
| Playfair Display | ~0.30 | g, q — långa dekorativa element |
| Inter | ~0.26 | g, p — märkbart under baseline |
| Noto Sans | ~0.20 | g — kort descender, kompakt |
Enligt Google Fonts Metrics Guide (2025) anses descender vara optimal när dess djup är 20–25 % av den fulla em-storleken (1000 FUnits). Värden under 15 % gör bokstäver med descender svåra att särskilja, och över 30 % kräver obligatorisk ökning av line-height för att förhindra radkollisioner.
I digitala typsnitt lagras descender som ett negativt värde i metrik-tabeller. I OpenType-format är detta fälten hhea.descent (tabell hhea) och sTypoDescender (tabell OS/2). Båda värdena är negativa eftersom de mäts från baseline nedåt. För TrueType används OS/2-tabellen med fältet usWinDescent — dess värde är positivt men betecknar samma metrik.
# Läsa descender från typsnitt via 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)
# Konvertera till pixlar för 16pt typsnittsstorlek
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Den kritiska skillnaden mellan plattformar: iOS använder hhea.descent för rendering, medan Android — sTypoDescender från OS/2. Om dessa värden skiljer sig (vilket förekommer i dåligt konfigurerade typsnitt), kommer samma text att visas med olika radavstånd på iOS och Android. En skillnad på 100 FUnits (ungefär 1.6 px vid storleken 16 pt) är redan visuellt märkbar.
Enligt Microsoft OpenType Specification v1.9 (2025) bör värdena för hhea.descent och sTypoDescender vara lika med en noggrannhet på 50 FUnits för korrekt rendering över plattformar. Vid val av typsnitt för en mobilapplikation bör detta kontrolleras via fontTools eller ett liknande verktyg.
I iOS är descenderns värde tillgängligt via egenskapen UIFont.descender. Denna egenskap returnerar ett negativt tal som visar avståndet från baseline till typsnittets nedre kant (inklusive descender). Till exempel för SF Pro vid storleken 17 pt är descenderns värde ungefär -4.2 pt. Ju större talets absoluta värde är, desto längre är typsnittets nedre utstick.
// Hämta descender på iOS via UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt för SF Pro 17pt
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// Anpassad rendering med descender-offset
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: hämta begränsningsram med descender
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
Vid användning av TextKit (NSTextStorage, NSLayoutManager) tas descender automatiskt med i lineFragmentPadding och lineFragmentRect. Vid anpassad rendering via Core Graphics (draw(in:)) måste du dock självständigt justera koordinaterna genom att lägga till descenderns absoluta värde till behållarens nedre marginal. Om detta inte görs kommer bokstäver med descender att gå utanför renderingsgränsen och kapas av.
I Android är descenderns metriker tillgängliga via Paint.FontMetrics.descent. Till skillnad från iOS är descent-värdet positivt — det är avståndet från baseline till textens nedre gräns. Egenskapen FontMetrics.bottom omfattar inte bara descendern utan även det extra utrymme som typsnittsdesignern rekommenderar (leading). För att noggrant endast ta hänsyn till descendern, använd descent, inte bottom.
// Hämta descender på Android via Paint
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px för 17sp
val bottom = metrics.bottom // ~5.0 px med leading
// Anpassad rendering med descender-offset
val baseline = y
canvas.drawText("Exempel: gpq", x, baseline, paint)
// Nedre gräns med descender
val bottomBound = baseline + descent // korrekt nedre gräns
I Jetpack Compose kan descender erhållas via TextLayoutResult. Metoden getLineBottom returnerar Y-koordinaten för radens nedre gräns, som redan inkluderar descendern. Vid anpassad layout av rader med olika storlekar (t.ex. pris med rabatt och fullt pris) ger justering baserat på baseline med hänsyn till descender ett mer exakt resultat än justering baserat på nedre kanten.
// Compose: kontrollera textens nedre gräns
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)
// Kontrollera att descender inte överskrider behållarens gränser
}
}
)
Enligt Google Material Design — Typography Implementation (2025), för att förhindra kapning av descender i behållare med fast höjd, måste vertikal padding läggas till som är minst lika med typsnittets descent, oavsett förekomsten av bokstäver med descender i den aktuella texten. Detta garanterar att gränssnittet inte går sönder vid dynamisk textbyte.
Radkollision (line collision) — situation där descendern från en bokstav på den övre raden fysiskt korsar ascendern från en bokstav på den nedre raden. I mobila gränssnitt är detta särskilt märkbart i flerradiga rubriker, produktkort och textblock med litet radavstånd. Problemet förvärras vid användning av typsnitt med lång descender och liten line-height.
Den minimala line-height som förhindrar kollisioner kan beräknas med formeln: line-height = ascender + descender + 2 px marginal. För SF Pro vid storleken 17 pt ger detta en line-height på ungefär 22.4 pt (koefficient ~1.32). För Roboto vid 16 sp — ungefär 1.35. Om line-height är lägre än detta värde är kollisioner garanterade i texter som innehåller bokstäver från gruppen “g”, “j”, “p”, “q”, “y”.
// iOS: beräkna minimal line-height för att förhindra kollisioner
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
]
)
Var särskilt försiktig vid arbete med dekorativa och handskrivna typsnitt — deras descender kan nå 35–40 % av em-storleken. Sådana typsnitt används sällan för huvudtext men kan tillämpas i rubriker. Även en enda förekomst av en bokstav med lång descender i en rubrik kan orsaka kollision med ett angränsande gränssnittselement.
Det vanligaste misstaget är kapning av descender i knappar och textfält. När vi ställer in höjden på en knapp eller ett textfält lika med line-height, utan att ta hänsyn till descender, kapas bokstäver med descender vid den nedre kanten. Detta är särskilt märkbart på systemknappar med rundade hörn, där descender kan överskrida avrundningsgränsen.
Enligt Nielsen Norman Group — Mobile Typography Research (2025) har 41 % av mobilapplikationerna minst en skärm där text med descender överskrider komponentens gränser. Detta leder till en minskning av läsbarheten med 15 % och en ökning av användarens tid för att slutföra uppgiften. Regelbunden testning med text som innehåller bokstäverna “g”, “j”, “p”, “q”, “y” hjälper till att identifiera sådana problem i tidiga utvecklingsskeden.
Vanliga frågor
Baseline är den horisontella linjen som bokstäver står på, medan descender är den del av bokstaven som befinner sig under denna linje. Baseline är en konstant för en rad, descender är en egenskap hos en specifik bokstav. Blanda inte ihop dessa begrepp: baseline används för justering, medan descender påverkar radavståndet och kräver uppmärksamhet vid inställning av behållarens höjd.
Använd Paint.getFontMetrics().descent för View-systemet eller TextLayoutResult i Jetpack Compose. Till skillnad från iOS är descent-värdet på Android positivt och visar avståndet från baseline till glyfens nedre gräns. För att beräkna radens fulla nedre gräns, lägg till descent till Y-koordinaten för baseline.
Plattformarna använder olika metrik-tabeller från typsnittsfilen: iOS — hhea.descent, Android — os/2.sTypoDescender. Om dessa värden i typsnittet skiljer sig, kommer renderingen att vara olika. Kontrollera alltid båda värdena via fontTools. Kvalitativa systemtypsnitt (SF Pro, Roboto, Noto) har konsekventa metriker för båda plattformarna.
Minimal line-height = ascender + descender + 2 px marginal. För systemtypsnittet 17 pt på iOS är detta ungefär 22.4 pt. På Android för 16 sp Roboto — ungefär 22 sp. Avrundning till närmaste heltal och kontroll med teststrängen “gpq” rekommenderas — om det inte finns några kollisioner är line-height tillräcklig.
Ja, men med förbehåll. Typsnitt med lång descender (Playfair Display, dekorativa typsnitt) är acceptabla för rubriker och accenttext, där line-height kan ökas utan att skada designen. För huvudtext är typsnitt med descender på 20–25 % av em-storleken (SF Pro, Roboto, Inter) att föredra för att spara onödigt vertikalt utrymme.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också