Descender in mobiele ontwikkeling — essentie, betekenis en invloed op lay-out

Auteur: IT Sectr Gepubliceerd: 2026-07-24 Leestijd: 9 min

Descender is het deel van een kleine letter dat onder de basislijn (baseline) van het lettertype uitsteekt. In het Latijnse alfabet zijn typische letters met een descender „g", „j", „p", „q", „y". De lengte van de descender bepaalt het onderste uitsteeksel van het lettertype en is cruciaal voor het berekenen van de regelafstand: zonder voldoende ruimte onder de baseline zullen letters met een descender de volgende regel raken. Volgens Material Design Type Scale Guidelines (2025) is onvoldoende rekening houden met de descender een van de belangrijkste oorzaken van botsingen (collision) van regels in meerregelige tekst op mobiele apparaten.

Belangrijkste punten

  • Descender — het onderste uitsteeksel van een letter, gelegen onder de baseline.
  • Metriek — descender is toegankelijk via UIFont.descender (iOS) en Paint.FontMetrics.descent (Android).
  • Line-height — descender maakt deel uit van de berekening van de volledige regelhoogte en vereist aandacht bij de lay-out.
  • Regelbotsingen — zonder rekening te houden met de descender raken letters „g", „j", „p", „q", „y" de onderliggende regel.
  • Verschillende lettertypen — de lengte van de descender varieert tussen fonts en beïnvloedt het visuele ritme.

Wat is Descender in typografie

Descender is het deel van een glyph dat zich onder de baseline bevindt. Terwijl het hoofdlichaam van de letter op de baseline staat, strekt de descender zich daarbuiten uit en creëert een karakteristiek silhouet van het lettertype. In Latijnse fonts hebben de letters „g", „j", „p", „q", „y" onderste uitsteeksels.

De diepte van de descender beschrijft de afstand van de baseline tot de ondergrens van de glyph (descender-line). In kwalitatieve lettertypen is deze afstand in balans: een te korte descender maakt letters met descender moeilijk herkenbaar, een te lange creëert overmatige witruimte tussen regels en vermindert de tekstdichtheid. Verschillende lettertypefamilies vertonen aanzienlijke verschillen in descenderlengte.

LettertypeDescender / em-sizeVoorbeeldletters met descender
SF Pro~0.22g, p — gebalanceerd uitsteeksel
Roboto~0.24g, p — gematigde descender
Playfair Display~0.30g, q — lange decoratieve elementen
Inter~0.26g, p — merkbaar onder baseline
Noto Sans~0.20g — korte descender, compact

Volgens Google Fonts Metrics Guide (2025) wordt de descender als optimaal beschouwd wanneer de diepte 20-25% van de volledige em-grootte (1000 FUnits) bedraagt. Waarden onder 15% maken letters met descender moeilijk te onderscheiden, en boven 30% vereisen een verplichte verhoging van de line-height om regelbotsingen te voorkomen.

Digitale metrieken van Descender: OpenType en TrueType

In digitale lettertypen wordt descender opgeslagen als een negatieve waarde in de metriektabellen. In het OpenType-formaat zijn dit de velden hhea.descent (tabel hhea) en sTypoDescender (tabel OS/2). Beide waarden zijn negatief omdat ze vanaf de baseline naar beneden worden gemeten. Voor TrueType wordt de OS/2-tabel met het veld usWinDescent gebruikt — de waarde is positief, maar verwijst naar dezelfde metriek.

python
# Descender uit lettertype lezen 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)

# Omzetten naar pixels voor lettergrootte 16pt
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000  # 8 px

Het kritische verschil tussen platforms: iOS gebruikt hhea.descent voor weergave, en Android — sTypoDescender uit OS/2. Als deze waarden verschillen (wat gebeurt bij slecht geconfigureerde lettertypen), wordt dezelfde tekst met verschillende regelafstanden op iOS en Android weergegeven. Een verschil van 100 FUnits (ongeveer 1.6 px bij een puntgrootte van 16 pt) is al visueel merkbaar.

Volgens Microsoft OpenType Specification v1.9 (2025) moeten voor correcte cross-platform weergave de waarden van hhea.descent en sTypoDescender gelijk zijn met een nauwkeurigheid van 50 FUnits. Bij het kiezen van een lettertype voor een mobiele app is het raadzaam dit te controleren via fontTools of een vergelijkbaar hulpprogramma.

Descender in iOS: UIFont en Core Graphics

In iOS is de descenderwaarde beschikbaar via de eigenschap UIFont.descender. Deze eigenschap retourneert een negatief getal dat de afstand van de baseline tot de onderrand van het lettertype (inclusief descender) aangeeft. Voor SF Pro bij een puntgrootte van 17 pt is de descenderwaarde bijvoorbeeld ongeveer -4.2 pt. Hoe groter de absolute waarde, hoe langer de onderste uitsteeksels van het lettertype.

swift
// Descender op iOS verkrijgen via UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender     // ~ -4.2 pt voor SF Pro 17pt
let ascender = font.ascender        // ~ 16.2 pt
let lineHeight = font.lineHeight    // ~ 20.4 pt

// Aangepaste weergave met descender-offset
let attrString = NSAttributedString(
    string: "Sample text with letter p and y",
    attributes: [.font: font]
)

// Core Text: begrenzingskader met descender verkrijgen
let ctFont = CTFontCreateWithName(
    "SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont)  // ~4.2 pt

Bij gebruik van TextKit (NSTextStorage, NSLayoutManager) wordt de descender automatisch meegenomen in lineFragmentPadding en lineFragmentRect. Bij aangepaste weergave via Core Graphics (draw(in:)) moet u echter zelf de coördinaten aanpassen door de absolute waarde van de descender toe te voegen aan de onderste marge van de container. Als dit niet gebeurt, zullen letters met een descender buiten het weergavegebied vallen en worden afgesneden.

Descender in Android: Paint en Compose

In Android zijn de descender-metrieken beschikbaar via Paint.FontMetrics.descent. In tegenstelling tot iOS is de descent-waarde positief — dit is de afstand van de baseline tot de ondergrens van de tekst. De eigenschap FontMetrics.bottom omvat niet alleen de descender, maar ook de extra ruimte aanbevolen door de letterontwerper (leading). Gebruik descent, niet bottom, om alleen de descender nauwkeurig mee te nemen.

kotlin
// Descender op Android verkrijgen via Paint
val paint = Paint().apply {
    textSize = 17 * density
}

val metrics = paint.fontMetrics
val descent = metrics.descent     // ~4.5 px voor 17sp
val bottom = metrics.bottom       // ~5.0 px met leading

// Aangepaste weergave met descender-offset
val baseline = y
canvas.drawText("Voorbeeld: gpq", x, baseline, paint)

// Ondergrens met descender
val bottomBound = baseline + descent  // juiste ondergrens

In Jetpack Compose kan de descender worden verkregen via TextLayoutResult. De methode getLineBottom retourneert de Y-coördinaat van de ondergrens van de regel, die al de descender bevat. Bij aangepaste lay-out van regels met verschillende puntgroottes (bijv. prijs met korting en volledige prijs) geeft uitlijning op basis van de baseline met inachtneming van de descender een nauwkeuriger resultaat dan uitlijning op de onderrand.

kotlin
// Compose: ondergrens van tekst controleren
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)
            // Controleren of descender de containergrenzen niet overschrijdt
        }
    }
)

Volgens Google Material Design — Typography Implementation (2025) moet u, om afsnijden van de descender in containers met een vaste hoogte te voorkomen, verticale padding toevoegen die ten minste gelijk is aan de descent van het lettertype, ongeacht of er letters met een descender in de huidige tekst voorkomen. Dit garandeert dat de interface niet breekt bij dynamische tekstvervanging.

Descender en regelbotsingen in mobiele interfaces

Regelbotsing (line collision) — een situatie waarin de descender van een letter op de bovenste regel fysiek overlapt met de ascender van een letter op de onderste regel. In mobiele interfaces is dit vooral zichtbaar in meerregelige koppen, productkaarten en tekstblokken met kleine regelafstand. Het probleem wordt verergerd bij het gebruik van lettertypen met lange descenders en kleine line-height.

De minimale line-height die botsingen voorkomt, kan worden berekend met de formule: line-height = ascender + descender + 2 px marge. Voor SF Pro bij 17 pt geeft dit een line-height van ongeveer 22.4 pt (coëfficiënt ~1.32). Voor Roboto bij 16 sp — ongeveer 1.35. Als de line-height lager is dan deze waarde, zijn botsingen gegarandeerd in teksten die letters uit de groep „g", „j", „p", „q", „y" bevatten.

swift
// iOS: minimale line-height berekenen om botsingen te voorkomen
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
    ]
)

Wees vooral voorzichtig bij het werken met decoratieve en handgeschreven lettertypen — hun descender kan 35-40% van de em-grootte bereiken. Dergelijke lettertypen worden zelden gebruikt voor hoofdtekst, maar kunnen worden toegepast in koppen. Zelfs een enkel voorkomen van een letter met een lange descender in een kop kan een botsing met een aangrenzend interface-element veroorzaken.

Veelvoorkomende fouten bij het werken met Descender

De meest voorkomende fout is het afsnijden van de descender in knoppen en tekstvelden. Wanneer we de hoogte van een knop of tekstveld gelijkstellen aan de line-height, zonder rekening te houden met de descender, worden letters met een descender aan de onderrand afgesneden. Dit is vooral zichtbaar op systeemknoppen met afgeronde hoeken, waar de descender buiten de afrondingsgrens kan vallen.

  • Knoppen met vaste hoogte — als de knophoogte gelijk is aan ceil(line-height), worden letters met descender afgesneden. Oplossing: verhoog de knophoogte met de absolute waarde van de descender (4-5 pt voor systeemlettertype 17 pt) voor boven- en ondermarge.
  • TextField zonder rekening te houden met descender — standaard UITextField en EditText hebben padding die rekening houdt met de descender, maar aangepaste implementaties vergeten dit vaak. Controleer of de cursor en het tekstblok geen letters met descender afsnijden.
  • Mengen van puntgroottes op één regel — als in NSAttributedString of SpannableString segmenten met verschillende puntgroottes voorkomen, kan de descender van het grotere lettertype overlappen met de ascender van het kleinere. Gebruik baselineOffset voor compensatie en controleer het resultaat.
  • SVG-weergave van tekst — bij het tekenen van tekst in SVG of op Canvas (vooral in WebView) wordt de descender mogelijk niet automatisch meegenomen. Stel altijd een expliciete viewBox in met een marge van 10-15% van de lettergrootte.

Volgens Nielsen Norman Group — Mobile Typography Research (2025) heeft 41% van de mobiele apps ten minste één scherm waar tekst met descender buiten de componentgrenzen valt. Dit leidt tot een vermindering van de leesbaarheid met 15% en een toename van de tijd die de gebruiker nodig heeft om een taak uit te voeren. Regelmatig testen met tekst die de letters „g", „j", „p", „q", „y" bevat, helpt om dergelijke problemen in een vroeg stadium van de ontwikkeling te identificeren.

Veelgestelde vragen

Waarin verschilt Descender van baseline?

Baseline is de horizontale lijn waarop letters staan, terwijl descender het deel van de letter is dat zich onder deze lijn bevindt. Baseline is een constante voor een regel, descender is een eigenschap van een specifieke letter. Verwar deze begrippen niet: baseline wordt gebruikt voor uitlijning, terwijl descender de regelafstand beïnvloedt en aandacht vereist bij het instellen van de containerhoogte.

Hoe kom ik de descender van een lettertype op Android te weten?

Gebruik Paint.getFontMetrics().descent voor het View-systeem of TextLayoutResult in Jetpack Compose. In tegenstelling tot iOS is de descent-waarde op Android positief en geeft de afstand van de baseline tot de ondergrens van de glyph weer. Voeg descent toe aan de Y-coördinaat van de baseline om de volledige ondergrens van de regel te berekenen.

Waarom verschilt de descender van hetzelfde lettertype op iOS en Android?

De platforms gebruiken verschillende metriektabellen uit het lettertypebestand: iOS — hhea.descent, Android — os/2.sTypoDescender. Als deze waarden in het lettertype verschillen, zal de weergave anders zijn. Controleer altijd beide waarden via fontTools. Kwalitatieve systeemlettertypen (SF Pro, Roboto, Noto) hebben consistente metrieken voor beide platforms.

Wat is de minimale line-height om descender-botsingen te voorkomen?

Minimale line-height = ascender + descender + 2 px marge. Voor het systeemlettertype van 17 pt op iOS is dit ongeveer 22.4 pt. Op Android voor 16 sp Roboto — ongeveer 22 sp. Afronden naar het dichtstbijzijnde gehele getal en controleren met de testreeks „gpq" wordt aanbevolen — als er geen botsingen zijn, is de line-height voldoende.

Kan ik een lettertype met een zeer lange descender gebruiken in een mobiele app?

Ja, maar met voorbehoud. Lettertypen met een lange descender (Playfair Display, decoratieve fonts) zijn acceptabel voor koppen en accidenstekst, waar de line-height kan worden verhoogd zonder het ontwerp te schaden. Voor hoofdtekst hebben lettertypen met een descender van 20-25% van de em-grootte (SF Pro, Roboto, Inter) de voorkeur om onnodige verticale ruimte te besparen.

Conclusies

  • Descender — het onderste uitsteeksel van een letter onder de baseline, aanwezig bij letters „g", „j", „p", „q", „y" (Latijn).
  • Digitale metrieken — hhea.descent (iOS) en os/2.sTypoDescender (Android) in OpenType/TrueType-formaten.
  • iOS API — UIFont.descender (negatieve waarde) voor UIKit en CTFontGetDescent voor Core Text.
  • Android API — Paint.FontMetrics.descent (positief) en TextLayoutResult in Compose.
  • Regelbotsingen — treden op wanneer line-height kleiner is dan ascender + descender + 2 px marge; gecontroleerd met de reeks „gpq".
  • Afsnijden in componenten — knoppen, tekstvelden en aangepaste containers moeten padding hebben gelijk aan de absolute waarde van de descender.
  • Platformverschil — iOS en Android gebruiken verschillende metriektabellen, wat controle van het lettertype op beide platforms vereist.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook