Descender v mobilním vývoji — podstata, význam a vliv na rozvržení

Autor: IT Sectr Publikováno: 2026-07-24 Doba čtení: 9 min

Descender je část malého písmene, která klesá pod základní linii (baseline) fontu. V latinské abecedě jsou typickými písmeny s descenderem „g", „j", „p", „q", „y". Délka descenderu určuje spodní výstupek fontu a je kritická pro výpočet řádkování: bez dostatečného prostoru pod baseline budou písmena s descenderem zasahovat do následujícího řádku. Podle Material Design Type Scale Guidelines (2025) je nedostatečné zohlednění descenderu jednou z hlavních příčin kolize řádků ve víceřádkovém textu na mobilních zařízeních.

Hlavní body

  • Descender — spodní výstupek písmene umístěný pod baseline.
  • Metrika — descender je dostupný přes UIFont.descender (iOS) a Paint.FontMetrics.descent (Android).
  • Line-height — descender vstupuje do výpočtu plné výšky řádku a vyžaduje pozornost při rozvržení.
  • Kolize řádků — bez zohlednění descenderu písmena „g", „j", „p", „q", „y" zasahují do spodního řádku.
  • Různé fonty — délka descenderu se liší mezi písmy a ovlivňuje vizuální rytmus.

Co je Descender v typografii

Descender je část glyfu umístěná pod linií baseline. Zatímco hlavní tělo písmene stojí na baseline, descender se za ní rozprostírá a vytváří charakteristickou siluetu fontu. V latinských fontech mají písmena „g", „j", „p", „q", „y" spodní výstupky.

Hloubka descenderu popisuje vzdálenost od baseline ke spodní hranici glyfu (descender-line). V kvalitních fontech je tato vzdálenost vyvážená: příliš krátký descender ztěžuje rozpoznání písmen s descenderem, příliš dlouhý vytváří nadměrný prázdný prostor mezi řádky a snižuje hustotu textu. Různé rodiny písem vykazují významné rozdíly v délce descenderu.

PísmoDescender / em-sizePříklad písmen s descenderem
SF Pro~0.22g, p — vyvážený výstupek
Roboto~0.24g, p — mírný descender
Playfair Display~0.30g, q — dlouhé dekorativní prvky
Inter~0.26g, p — znatelně pod baseline
Noto Sans~0.20g — krátký descender, kompaktní

Podle Google Fonts Metrics Guide (2025) je descender považován za optimální, když jeho hloubka činí 20–25 % plné velikosti em (1000 FUnits). Hodnoty pod 15 % ztěžují rozlišení písmen s descenderem a nad 30 % vyžadují povinné zvýšení line-height, aby se předešlo kolizím řádků.

Digitální metriky Descenderu: OpenType a TrueType

V digitálních fontech je descender uložen jako záporná hodnota v tabulkách metrik. Ve formátu OpenType jsou to pole hhea.descent (tabulka hhea) a sTypoDescender (tabulka OS/2). Obě hodnoty jsou záporné, protože se měří od baseline směrem dolů. Pro TrueType se používá tabulka OS/2 s polem usWinDescent — jeho hodnota je kladná, ale označuje stejnou metriku.

python
# Čtení descenderu z fontu pomocí 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)

# Převod na pixely pro velikost fontu 16pt
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000  # 8 px

Kritický rozdíl mezi platformami: iOS používá hhea.descent pro vykreslování, zatímco Android — sTypoDescender z OS/2. Pokud se tyto hodnoty liší (což se stává u nekvalitně nastavených fontů), stejný text se zobrazí s různým řádkováním na iOS a Androidu. Rozdíl 100 FUnits (přibližně 1.6 px při velikosti 16 pt) je již vizuálně patrný.

Podle Microsoft OpenType Specification v1.9 (2025) by pro správné vykreslování napříč platformami měly být hodnoty hhea.descent a sTypoDescender stejné s přesností 50 FUnits. Při výběru fontu pro mobilní aplikaci je vhodné to zkontrolovat pomocí fontTools nebo podobného nástroje.

Descender v iOS: UIFont a Core Graphics

V iOS je hodnota descenderu dostupná prostřednictvím vlastnosti UIFont.descender. Tato vlastnost vrací záporné číslo udávající vzdálenost od baseline ke spodnímu okraji fontu (včetně descenderu). Například pro SF Pro při velikosti 17 pt je hodnota descenderu přibližně -4.2 pt. Čím větší je absolutní hodnota, tím delší jsou spodní výstupky fontu.

swift
// Získání descenderu na iOS pomocí UIFont
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender     // ~ -4.2 pt pro SF Pro 17pt
let ascender = font.ascender        // ~ 16.2 pt
let lineHeight = font.lineHeight    // ~ 20.4 pt

// Vlastní vykreslování s odsazením descenderu
let attrString = NSAttributedString(
    string: "Sample text with letter p and y",
    attributes: [.font: font]
)

// Core Text: získání ohraničujícího rámečku s descenderem
let ctFont = CTFontCreateWithName(
    "SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont)  // ~4.2 pt

Při použití TextKitu (NSTextStorage, NSLayoutManager) je descender automaticky zohledněn v lineFragmentPadding a lineFragmentRect. Při vlastním vykreslování přes Core Graphics (draw(in:)) je však nutné nezávisle upravit souřadnice přidáním absolutní hodnoty descenderu ke spodnímu okraji kontejneru. Pokud se tak nestane, písmena s descenderem překročí hranici vykreslování a budou oříznuta.

Descender v Androidu: Paint a Compose

V Androidu jsou metriky descenderu dostupné přes Paint.FontMetrics.descent. Na rozdíl od iOS je hodnota descent kladná — jedná se o vzdálenost od baseline ke spodní hranici textu. Vlastnost FontMetrics.bottom zahrnuje nejen descender, ale také dodatečný prostor doporučený návrhářem fontu (leading). Pro přesné zohlednění pouze descenderu použijte descent, nikoli bottom.

kotlin
// Získání descenderu na Androidu pomocí Paint
val paint = Paint().apply {
    textSize = 17 * density
}

val metrics = paint.fontMetrics
val descent = metrics.descent     // ~4.5 px pro 17sp
val bottom = metrics.bottom       // ~5.0 px s leadingem

// Vlastní vykreslování s odsazením descenderu
val baseline = y
canvas.drawText("Příklad: gpq", x, baseline, paint)

// Spodní hranice s descenderem
val bottomBound = baseline + descent  // správná spodní hranice

V Jetpack Compose lze descender získat přes TextLayoutResult. Metoda getLineBottom vrací Y souřadnici spodní hranice řádku, která již descender obsahuje. Při vlastním rozvržení řádků s různými velikostmi (např. cena se slevou a plná cena) poskytuje zarovnání podle baseline s ohledem na descender přesnější výsledek než zarovnání podle spodního okraje.

kotlin
// Compose: kontrola spodní hranice textu
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)
            // Kontrola, zda descender nepřesahuje hranice kontejneru
        }
    }
)

Podle Google Material Design — Typography Implementation (2025) je pro zabránění oříznutí descenderu v kontejnerech s pevnou výškou nutné přidat vertikální padding odpovídající alespoň descentu fontu, bez ohledu na přítomnost písmen s descenderem v aktuálním textu. Tím je zaručeno, že při dynamické výměně textu se rozhraní nerozbije.

Descender a kolize řádků v mobilních rozhraních

Kolize řádků (line collision) — situace, kdy descender písmene horního řádku fyzicky protíná ascender písmene spodního řádku. V mobilních rozhraních je to patrné zejména u víceřádkových nadpisů, karet produktů a textových bloků s malým řádkováním. Problém se zhoršuje při použití fontů s dlouhým descenderem a malým line-height.

Minimální line-height zabraňující kolizím lze vypočítat podle vzorce: line-height = ascender + descender + 2 px rezerva. Pro SF Pro při velikosti 17 pt to dává line-height přibližně 22.4 pt (koeficient ~1.32). Pro Roboto při 16 sp — přibližně 1.35. Pokud je line-height nižší než tato hodnota, kolize jsou zaručeny v textech obsahujících písmena ze skupiny „g", „j", „p", „q", „y".

swift
// iOS: výpočet minimálního line-height k zabránění kolizím
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
    ]
)

Zvláště opatrní buďte při práci s dekorativními a ručně psanými fonty — jejich descender může dosahovat 35–40 % velikosti em. Takové fonty se zřídka používají pro hlavní text, ale mohou být aplikovány v nadpisech. I jediný výskyt písmene s dlouhým descenderem v nadpisu může způsobit kolizi se sousedním prvkem rozhraní.

Typické chyby při práci s Descenderem

Nejčastější chybou je oříznutí descenderu v tlačítkách a textových polích. Když nastavíme výšku tlačítka nebo textového pole rovnou line-height, bez zohlednění descenderu, písmena s descenderem se oříznou na spodním okraji. To je patrné zejména na systémových tlačítkách se zaoblenými rohy, kde descender může přesahovat hranici zaoblení.

  • Tlačítka s pevnou výškou — pokud je výška tlačítka rovna ceil(line-height), písmena s descenderem se oříznou. Řešení: zvyšte výšku tlačítka o absolutní hodnotu descenderu (4–5 pt pro systémový font 17 pt) pro horní a spodní okraj.
  • TextField bez zohlednění descenderu — standardní UITextField a EditText mají padding zohledňující descender, ale vlastní implementace na něj často zapomínají. Zkontrolujte, že kurzor a textový blok neořezávají písmena s descenderem.
  • Míchání velikostí v jednom řádku — pokud se v NSAttributedString nebo SpannableString vyskytují segmenty s různými velikostmi, descender většího fontu se může překrýt s ascenderem menšího. Použijte baselineOffset pro kompenzaci a zkontrolujte výsledek.
  • SVG vykreslování textu — při kreslení textu v SVG nebo na Canvas (zejména ve WebView) nemusí být descender automaticky zohledněn. Vždy nastavte explicitní viewBox s rezervou 10–15 % velikosti fontu.

Podle Nielsen Norman Group — Mobile Typography Research (2025) má 41 % mobilních aplikací alespoň jednu obrazovku, kde text s descenderem překračuje hranice komponenty. To vede ke snížení čitelnosti o 15 % a zvýšení doby dokončení úkolu uživatelem. Pravidelné testování s textem obsahujícím písmena „g", „j", „p", „q", „y" pomáhá odhalit tyto problémy v raných fázích vývoje.

Často kladené otázky

Čím se liší Descender od baseline?

Baseline je vodorovná čára, na které stojí písmena, zatímco descender je část písmene nacházející se pod touto čárou. Baseline je pro řádek konstantou, descender je vlastností konkrétního písmene. Nezaměňujte tyto pojmy: baseline se používá pro zarovnání, zatímco descender ovlivňuje řádkování a vyžaduje pozornost při nastavování výšky kontejneru.

Jak zjistím descender fontu na Androidu?

Použijte Paint.getFontMetrics().descent pro View systém nebo TextLayoutResult v Jetpack Compose. Na rozdíl od iOS je hodnota descent na Androidu kladná a ukazuje vzdálenost od baseline ke spodní hranici glyfu. Pro výpočet plné spodní hranice řádku přičtěte descent k Y souřadnici baseline.

Proč se descender stejného fontu liší na iOS a Androidu?

Platformy používají různé tabulky metrik ze souboru fontu: iOS — hhea.descent, Android — os/2.sTypoDescender. Pokud se tyto hodnoty ve fontu liší, vykreslování se bude lišit. Vždy kontrolujte obě hodnoty pomocí fontTools. Kvalitní systémové fonty (SF Pro, Roboto, Noto) mají konzistentní metriky pro obě platformy.

Jaký minimální line-height je potřeba k zabránění kolizím descenderu?

Minimální line-height = ascender + descender + 2 px rezerva. Pro systémový font 17 pt na iOS je to přibližně 22.4 pt. Na Androidu pro 16 sp Roboto — přibližně 22 sp. Doporučuje se zaokrouhlit na nejbližší celé číslo a zkontrolovat testovacím řetězcem „gpq" — pokud nedochází ke kolizím, line-height je dostatečný.

Mohu použít font s velmi dlouhým descenderem v mobilní aplikaci?

Ano, ale s výhradami. Fonty s dlouhým descenderem (Playfair Display, dekorativní písma) jsou přijatelné pro nadpisy a akcidenční text, kde lze line-height zvýšit bez poškození designu. Pro hlavní text jsou preferovány fonty s descenderem 20–25 % velikosti em (SF Pro, Roboto, Inter), aby se neplýtvalo zbytečným vertikálním prostorem.

Závěry

  • Descender — spodní výstupek písmene pod baseline, přítomný u písmen „g", „j", „p", „q", „y" (latinka).
  • Digitální metriky — hhea.descent (iOS) a os/2.sTypoDescender (Android) ve formátech OpenType/TrueType.
  • iOS API — UIFont.descender (záporná hodnota) pro UIKit a CTFontGetDescent pro Core Text.
  • Android API — Paint.FontMetrics.descent (kladná) a TextLayoutResult v Compose.
  • Kolize řádků — nastávají, když je line-height menší než ascender + descender + 2 px rezerva; kontrolují se řetězcem „gpq".
  • Oříznutí v komponentách — tlačítka, textová pole a vlastní kontejnery musí mít padding rovný absolutní hodnotě descenderu.
  • Rozdíl platforem — iOS a Android používají různé tabulky metrik, což vyžaduje kontrolu fontu na obou platformách.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také