Descender ist der Teil eines Kleinbuchstabens, der unter die Grundlinie (Baseline) der Schrift hinausragt. Im Lateinischen sind typische Buchstaben mit Descender „g“, „j“, „p“, „q“, „y“. Die Länge des Descenders bestimmt den unteren Auslauf der Schrift und ist für die Berechnung des Zeilenabstands entscheidend: Ohne ausreichenden Platz unterhalb der Baseline kollidieren Buchstaben mit Descender mit der nächsten Zeile. Laut den Material Design Type Scale Guidelines (2025) ist die unzureichende Berücksichtigung des Descenders eine der Hauptursachen für Zeilenkollisionen in mehrzeiligem Text auf mobilen Geräten.
Wichtige Punkte
Descender ist der Teil einer Glyphe, der sich unterhalb der Grundlinie befindet. Während der Hauptkörper des Buchstabens auf der Baseline sitzt, erstreckt sich der Descender darüber hinaus und erzeugt die charakteristische Silhouette der Schrift. Im lateinischen Alphabet gehören zu den Buchstaben mit Descender „g“, „j“, „p“, „q“, „y“ — ihre unteren Elemente fallen unter die Linie.
Die Tiefe des Descenders beschreibt den Abstand von der Baseline zur unteren Kante der Glyphe (Descender-Linie). In qualitativ hochwertigen Schriften ist dieser Abstand ausgewogen: Ein zu kurzer Descender erschwert das Erkennen von Buchstaben mit Descender, während ein zu langer Descender übermäßigen Leerraum zwischen den Zeilen schafft und die Textdichte verringert. Verschiedene Schriftarten zeigen erhebliche Unterschiede in der Descender-Länge.
| Schriftart | Descender / em-size | Beispiele für Buchstaben mit Descender |
|---|---|---|
| SF Pro | ~0.22 | g, j, p, q, y — ausgewogener Auslauf |
| Roboto | ~0.24 | g, j, p — mäßiger Descender |
| Playfair Display | ~0.30 | g, j, p, q — lange dekorative Elemente |
| Inter | ~0.26 | g, j, p — deutlich unter der Baseline |
| Noto Sans | ~0.20 | g, j — kurzer Descender, kompakt |
Laut dem Google Fonts Metrics Guide (2025) gilt ein Descender als optimal, wenn seine Tiefe 20–25 % der gesamten em-Größe (1000 FUnits) beträgt. Werte unter 15 % erschweren die Unterscheidung von Buchstaben mit Descender, während Werte über 30 % eine zwingende Erhöhung des line-height erfordern, um Zeilenkollisionen zu vermeiden.
In digitalen Schriften wird der Descender als negativer Wert in den Metriktabellen gespeichert. Im OpenType-Format sind dies das Feld hhea.descent (hhea-Tabelle) und sTypoDescender (OS/2-Tabelle). Beide Werte sind negativ, da sie von der Baseline nach unten gemessen werden. Für TrueType wird die OS/2-Tabelle mit dem Feld usWinDescent verwendet — sein Wert ist positiv, bezeichnet aber dieselbe Metrik.
# Descender aus Schrift via fontTools auslesen
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)
# In Pixel für 16pt Schriftgröße umwandeln
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
Der kritische Unterschied zwischen den Plattformen: iOS verwendet hhea.descent für das Rendering, während Android sTypoDescender aus OS/2 verwendet. Wenn diese Werte abweichen (was bei schlecht konfigurierten Schriften vorkommt), wird derselbe Text auf iOS und Android mit unterschiedlichen Zeilenabständen angezeigt. Ein Unterschied von 100 FUnits (ca. 1,6 px bei 16 pt Schriftgröße) ist bereits visuell erkennbar.
Gemäß der Microsoft OpenType Specification v1.9 (2025) müssen für korrektes plattformübergreifendes Rendering die Werte hhea.descent und sTypoDescender auf 50 FUnits genau übereinstimmen. Bei der Auswahl einer Schrift für eine mobile Anwendung sollte dies über fontTools oder ein ähnliches Dienstprogramm überprüft werden.
In iOS ist der Descender-Wert über die Eigenschaft UIFont.descender verfügbar. Diese Eigenschaft gibt eine negative Zahl zurück, die den Abstand von der Baseline zur unteren Kante der Schrift (einschließlich des Descenders) angibt. Für SF Pro bei 17 pt beträgt der Descender-Wert beispielsweise etwa -4,2 pt. Je größer der Absolutwert, desto länger sind die unteren Ausläufe der Schrift.
// Descender auf iOS via UIFont abrufen
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
// Benutzerdefiniertes Rendering mit Descender-Versatz
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: Begrenzungsrahmen mit Descender abrufen
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4,2 pt
Bei Verwendung von TextKit (NSTextStorage, NSLayoutManager) wird der Descender automatisch in lineFragmentPadding und lineFragmentRect berücksichtigt. Bei benutzerdefiniertem Rendering über Core Graphics (draw(in:)) müssen Sie die Koordinaten jedoch manuell anpassen, indem Sie den Absolutwert des Descenders zum unteren Rand des Containers hinzufügen. Geschieht dies nicht, ragen Buchstaben mit Descender über die Rendering-Grenzen hinaus und werden abgeschnitten.
In Android sind die Descender-Metriken über Paint.FontMetrics.descent verfügbar. Im Gegensatz zu iOS ist der descent-Wert positiv — er gibt den Abstand von der Baseline zur unteren Kante des Textes an. Die Eigenschaft FontMetrics.bottom umfasst nicht nur den Descender, sondern auch den zusätzlichen vom Schriftdesigner empfohlenen Platz (Leading). Für eine genaue Berechnung nur des Descenders verwenden Sie descent statt bottom.
// Descender auf Android via Paint abrufen
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 mit Leading
// Benutzerdefiniertes Rendering mit Descender-Versatz
val baseline = y
canvas.drawText("Beispiel: gpq", x, baseline, paint)
// Untere Grenze mit Descender
val bottomBound = baseline + descent // korrekte untere Grenze
In Jetpack Compose kann der Descender über TextLayoutResult abgerufen werden. Die Methode getLineBottom gibt die Y-Koordinate der unteren Kante der Zeile zurück, die bereits den Descender enthält. Bei benutzerdefiniertem Layout von Zeichenfolgen mit unterschiedlichen Schriftgrößen (z. B. einem reduzierten Preis und einem Vollpreis) liefert die Baseline-Ausrichtung unter Berücksichtigung des Descenders ein genaueres Ergebnis als die Ausrichtung an der Unterkante.
// Compose: untere Textgrenze prüfen
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)
// Prüfen, ob Descender die Containerbegrenzung nicht überschreitet
}
}
)
Laut Google Material Design — Typography Implementation (2025) muss zur Vermeidung von Descender-Beschneidungen in Containern mit fester Höhe ein vertikaler Padding in Höhe von mindestens dem descent der Schrift hinzugefügt werden, unabhängig davon, ob der aktuelle Text Buchstaben mit Descender enthält. Dadurch wird sichergestellt, dass die Oberfläche nicht beschädigt wird, wenn der Text dynamisch ersetzt wird.
Eine Zeilenkollision ist eine Situation, in der der Descender eines Buchstabens der oberen Zeile physisch mit dem Ascender eines Buchstabens der unteren Zeile kreuzt. In mobilen Oberflächen ist dies besonders bei mehrzeiligen Überschriften, Produktkarten und Textblöcken mit geringem Zeilenabstand auffällig. Das Problem wird bei Schriften mit langem Descender und kleinem line-height verstärkt.
Der minimale line-height, der Kollisionen verhindert, kann mit der Formel berechnet werden: line-height = ascender + descender + 2 px Abstand. Für SF Pro bei 17 pt ergibt sich ein line-height von etwa 16,2 + 4,2 + 2 = 22,4 pt (ein Faktor von ~1,32). Für Roboto bei 16 sp etwa 1,35. Wenn der line-height kleiner als dieser Wert ist, sind Kollisionen in Texten mit Buchstaben mit Descender garantiert.
// iOS: minimalen line-height zur Vermeidung von Kollisionen berechnen
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
]
)
Besondere Vorsicht ist bei der Arbeit mit dekorativen und handgeschriebenen Schriften geboten — ihr Descender kann 35–40 % der em-Größe erreichen. Solche Schriften werden selten für Fließtext verwendet, können aber in Überschriften eingesetzt werden. Selbst ein einzelnes Vorkommen eines Buchstabens mit langem Descender in einer Überschrift kann eine Kollision mit einem benachbarten Oberflächenelement verursachen.
Der häufigste Fehler ist das Abschneiden des Descenders in Schaltflächen und Textfeldern. Wenn wir die Höhe einer Schaltfläche oder eines Textfelds gleich dem line-height setzen, ohne den Descender zu berücksichtigen, werden Buchstaben mit Descender am unteren Rand abgeschnitten. Dies macht sich besonders bei Systemschaltflächen mit abgerundeten Ecken bemerkbar, bei denen der Descender über die Grenze des Eckenradius hinausragen kann.
Laut Nielsen Norman Group — Mobile Typography Research (2025) haben 41 % der mobilen Anwendungen mindestens einen Bildschirm, auf dem Text mit Descendern über die Komponentengrenzen hinausragt. Dies führt zu einer 15-prozentigen Verringerung der Lesbarkeit und einer Verlängerung der Aufgabenerfüllungszeit durch den Benutzer. Regelmäßige Tests mit Text, der Buchstaben mit Descender enthält, helfen, solche Probleme in frühen Entwicklungsstadien zu erkennen.
Häufig gestellte Fragen
Baseline ist die horizontale Linie, auf der Buchstaben stehen, während der Descender der Teil des Buchstabens ist, der sich unterhalb dieser Linie befindet. Die Baseline ist eine Konstante für die Zeile, der Descender eine Eigenschaft eines bestimmten Buchstabens. Verwechseln Sie diese Konzepte nicht: Die Baseline wird für die Ausrichtung verwendet, während der Descender den Zeilenabstand beeinflusst und bei der Festlegung der Containerhöhe berücksichtigt werden muss.
Verwenden Sie Paint.getFontMetrics().descent für das View-System oder TextLayoutResult in Jetpack Compose. Im Gegensatz zu iOS ist der descent-Wert auf Android positiv und gibt den Abstand von der Baseline zur unteren Kante der Glyphe an. Um die vollständige untere Grenze der Zeile zu berechnen, addieren Sie descent zur Y-Koordinate der Baseline.
Die Plattformen verwenden unterschiedliche Metriktabellen aus der Schriftdatei: iOS verwendet hhea.descent, Android verwendet os/2.sTypoDescender. Wenn diese Werte in der Schrift abweichen, unterscheidet sich das Rendering. Überprüfen Sie immer beide Werte über fontTools. Hochwertige Systemschriften (SF Pro, Roboto, Noto) haben konsistente Metriken für beide Plattformen.
Der minimale line-height = ascender + descender + 2 px Abstand. Für eine 17-pt-Systemschrift auf iOS sind das etwa 22,4 pt. Auf Android für 16 sp Roboto etwa 22 sp. Es wird empfohlen, auf die nächste ganze Zahl zu runden und mit einer Testzeichenfolge von Buchstaben mit Descender zu prüfen — wenn keine Kollisionen auftreten, ist der line-height ausreichend.
Ja, aber mit Einschränkungen. Schriften mit langem Descender (Playfair Display, dekorative Schriftarten) sind für Überschriften und Akzenttexte akzeptabel, bei denen der line-height ohne Beeinträchtigung des Designs erhöht werden kann. Für Fließtexte werden Schriften mit einem Descender von 20–25 % der em-Größe (SF Pro, Roboto, Inter) bevorzugt, um keinen vertikalen Platz zu verschwenden.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch