Descender a mobilfejlesztésben — lényege, jelentősége és hatása a layoutra

Szerző: IT Sectr Megjelenés: 2026-07-24 Olvasási idő: 9 perc

Descender a kisbetűk azon része, amely a betűtípszer alapvonala (baseline) alá nyúlik. A latin ábécében tipikus descenderrel rendelkező betűk „g", „j", „p", „q", „y". A descender hossza meghatározza a betűtípszer alsó lenyúló elemét, és kritikus a sorköz kiszámításához: elegendő hely nélkül a baseline alatt a descenderrel rendelkező betűk beleütköznek a következő sorba. A Material Design Type Scale Guidelines (2025) szerint a descender elégtelen figyelembevétele a sorok ütközésének (collision) egyik fő oka a több soros szövegben mobileszközökön.

Főbb pontok

  • Descender — a betű alsó lenyúló eleme, amely a baseline alatt helyezkedik el.
  • Metrika — a descender elérhető az UIFont.descender (iOS) és a Paint.FontMetrics.descent (Android) segítségével.
  • Line-height — a descender beleszámít a sor teljes magasságának számításába, és figyelmet igényel a layoutban.
  • Sorütközések — a descender figyelembevétele nélkül a „g", „j", „p", „q", „y" betűk beleütköznek az alsó sorba.
  • Különböző betűtípusok — a descender hossza változik a betűcsaládok között, befolyásolva a vizuális ritmust.

Mi az a Descender a tipográfiában

Descender a glif azon része, amely a baseline alatt található. Míg a betű fő teste a baseline-on áll, a descender azon túlnyúlik, jellegzetes sziluettet adva a betűtípusnak. A latin betűtípusokban a „g", „j", „p", „q", „y" betűk rendelkeznek alsó lenyúló elemekkel.

A descender mélysége a baseline-tól a glif alsó határáig (descender-line) tartó távolságot írja le. Minőségi betűtípusokban ez a távolság kiegyensúlyozott: a túl rövid descender megnehezíti a descenderrel rendelkező betűk felismerését, a túl hosszú pedig felesleges üres helyet teremt a sorok között, csökkentve a szöveg sűrűségét. A különböző betűcsaládok jelentős eltéréseket mutatnak a descender hosszában.

BetűtípusDescender / em-sizePéldabetűk descenderrel
SF Pro~0.22g, p — kiegyensúlyozott lenyúlás
Roboto~0.24g, p — mérsékelt descender
Playfair Display~0.30g, q — hosszú díszítő elemek
Inter~0.26g, p — észrevehetően a baseline alatt
Noto Sans~0.20g — rövid descender, kompakt

A Google Fonts Metrics Guide (2025) szerint a descender akkor tekinthető optimálisnak, ha mélysége a teljes em méret (1000 FUnits) 20–25%-a. A 15% alatti értékek megnehezítik a descenderrel rendelkező betűk megkülönböztetését, a 30% felettiek pedig a line-height kötelező növelését teszik szükségessé a sorütközések elkerülése érdekében.

A Descender digitális metrikái: OpenType és TrueType

A digitális betűtípusokban a descender negatív értékként van tárolva a metrika táblákban. Az OpenType formátumban ez a hhea.descent mező (hhea tábla) és az sTypoDescender (OS/2 tábla). Mindkét érték negatív, mivel a baseline-tól lefelé mérve kerülnek meghatározásra. A TrueType esetében az OS/2 táblát használják az usWinDescent mezővel — ennek értéke pozitív, de ugyanazt a metrikát jelöli.

python
# Descender kiolvasása a betűtípusból a fontTools segítségével
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)

# Átalakítás pixelekre 16pt betűméret esetén
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000  # 8 px

A platformok közötti kritikus különbség: az iOS a hhea.descent használja a rendereléshez, míg az Android az OS/2 sTypoDescender mezőjét. Ha ezek az értékek eltérnek (ami gyengén konfigurált betűtípusoknál előfordul), ugyanaz a szöveg eltérő sorközzel jelenik meg iOS-en és Androidon. A 100 FUnits különbség (16 pt méretnél kb. 1.6 px) már vizuálisan észrevehető.

A Microsoft OpenType Specification v1.9 (2025) szerint a helyes platformok közötti rendereléshez a hhea.descent és az sTypoDescender értékeinek 50 FUnits pontossággal egyenlőnek kell lenniük. Mobileszközökre szánt betűtípus kiválasztásakor ezt fontTools vagy hasonló segédprogram segítségével érdemes ellenőrizni.

Descender iOS-ben: UIFont és Core Graphics

iOS rendszerben a descender értéke az UIFont.descender tulajdonságon keresztül érhető el. Ez a tulajdonság negatív számot ad vissza, amely a baseline-tól a betűtípszer alsó széléig (a descendert is beleértve) mutatja a távolságot. Például az SF Pro esetében 17 pt méretnél a descender értéke kb. -4.2 pt. Minél nagyobb a szám abszolút értéke, annál hosszabbak a betűtípszer alsó lenyúló elemei.

swift
// Descender lekérése iOS-en UIFont segítségével
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender     // ~ -4.2 pt az SF Pro 17pt esetében
let ascender = font.ascender        // ~ 16.2 pt
let lineHeight = font.lineHeight    // ~ 20.4 pt

// Egyedi renderelés descender eltolással
let attrString = NSAttributedString(
    string: "Sample text with letter p and y",
    attributes: [.font: font]
)

// Core Text: határoló doboz lekérése descenderrel
let ctFont = CTFontCreateWithName(
    "SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont)  // ~4.2 pt

A TextKit (NSTextStorage, NSLayoutManager) használatakor a descender automatikusan figyelembe van véve a lineFragmentPadding és lineFragmentRect értékekben. Azonban egyedi rendereléskor a Core Graphics (draw(in:)) segítségével manuálisan kell beállítani a koordinátákat, hozzáadva a descender abszolút értékét a konténer alsó margójához. Ha ez nem történik meg, a descenderrel rendelkező betűk kilépnek a renderelési határon és levágódnak.

Descender Androidban: Paint és Compose

Android rendszerben a descender metrikái a Paint.FontMetrics.descent segítségével érhetők el. Az iOS-szel ellentétben itt a descent értéke pozitív — ez a baseline-tól a szöveg alsó határáig tartó távolság. A FontMetrics.bottom tulajdonság nemcsak a descendert foglalja magában, hanem a betűtervező által ajánlott további helyet (leading) is. A descender pontos figyelembevételéhez a descent értéket használjuk, ne a bottom-ot.

kotlin
// Descender lekérése Androidon Paint segítségével
val paint = Paint().apply {
    textSize = 17 * density
}

val metrics = paint.fontMetrics
val descent = metrics.descent     // ~4.5 px 17sp esetében
val bottom = metrics.bottom       // ~5.0 px leadinggel

// Egyedi renderelés descender eltolással
val baseline = y
canvas.drawText("Példa: gpq", x, baseline, paint)

// Alsó határ descenderrel
val bottomBound = baseline + descent  // helyes alsó határ

Jetpack Compose keretrendszerben a descender a TextLayoutResult segítségével érhető el. A getLineBottom metódus visszaadja a sor alsó határának Y koordinátáját, amely már tartalmazza a descendert. Különböző méretű sorok (pl. akciós ár és teljes ár) egyedi elrendezésekor a baseline szerinti igazítás a descender figyelembevételével pontosabb eredményt ad, mint az alsó szél szerinti igazítás.

kotlin
// Compose: szöveg alsó határának ellenőrzése
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)
            // Annak ellenőrzése, hogy a descender nem lépi túl a konténer határait
        }
    }
)

A Google Material Design — Typography Implementation (2025) szerint a fix magasságú konténerekben a descender levágódásának megakadályozásához legalább a betűtípus descent értékével megegyező függőleges paddinget kell hozzáadni, függetlenül attól, hogy a jelenlegi szöveg tartalmaz-e descenderrel rendelkező betűket. Ez garantálja, hogy a szöveg dinamikus cseréjekor a felület nem fog elromlani.

Descender és sorütközések mobil felületeken

Sorütközés (line collision) — az az állapot, amikor a felső sor betűjének descendere fizikailag keresztezi az alsó sor betűjének ascendert. Mobil felületeken ez különösen észrevehető a több soros címsorokban, termékkártyákban és kis sorközű szövegdobozokban. A probléma súlyosbodik hosszú descenderrel rendelkező betűtípusok és kis line-height használatakor.

Az ütközéseket megakadályozó minimális line-height a következő képlettel számítható ki: line-height = ascender + descender + 2 px tartalék. Az SF Pro esetében 17 pt méretnél ez kb. 22.4 pt line-height-ot ad (coeffiens ~1.32). A Roboto esetében 16 sp-nél — kb. 1.35. Ha a line-height kisebb ennél az értéknél, az ütközés garantált a „g", „j", „p", „q", „y" csoportba tartozó betűket tartalmazó szövegekben.

swift
// iOS: minimális line-height kiszámítása az ütközések elkerüléséhez
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
    ]
)

Különösen óvatosnak kell lenni a dekoratív és kézírásos betűtípusokkal — ezek descendere elérheti az em méret 35–40%-át. Az ilyen betűtípusokat ritkán használják fő szöveghez, de címsorokban alkalmazhatók. Már egyetlen hosszú descenderrel rendelkező betű megjelenése egy címsorban ütközést okozhat a szomszédos felületi elemmel.

Tipikus hibák a Descender használatakor

A leggyakoribb hiba a descender levágódása a gombokban és szövegmezőkben. Amikor a gomb vagy szövegmező magasságát a line-height-dal egyenlőre állítjuk, a descender figyelembevétele nélkül, a descenderrel rendelkező betűk az alsó szélen levágódnak. Ez különösen észrevehető a lekerekített sarkú rendszergombokon, ahol a descender túlléphet a lekerekítés határán.

  • Fix magasságú gombok — ha a gomb magassága egyenlő a ceil(line-height)-dal, a descenderrel rendelkező betűk levágódnak. Megoldás: növeljük a gomb magasságát a descender abszolút értékével (4–5 pt a 17 pt rendszerbetűtípus esetében) a felső és alsó margóhoz.
  • TextField a descender figyelembevétele nélkül — a szabványos UITextField és EditText rendelkezik a descendert figyelembe vevő paddinggel, de az egyedi implementációk gyakran elfelejtik. Ellenőrizzük, hogy a kurzor és a szövegdoboz nem vágja-e le a descenderrel rendelkező betűket.
  • Különböző méretek keverése egy sorban — ha az NSAttributedString vagy SpannableString különböző méretű szegmenseket tartalmaz, a nagyobb betűtípszer descendere rákerülhet a kisebb ascenderére. Használjunk baselineOffset-ot a kompenzációhoz és ellenőrizzük az eredményt.
  • Szöveg SVG renderelése — szöveg SVG-ben vagy Canvas-en (különösen WebView-ban) történő rajzolásakor a descender lehet, hogy nem kerül automatikusan figyelembevételre. Mindig állítsunk be explicit viewBox-ot a betűméret 10–15%-ának megfelelő tartalékkal.

A Nielsen Norman Group — Mobile Typography Research (2025) szerint a mobilalkalmazások 41%-ának van legalább egy olyan képernyője, ahol a descenderrel rendelkező szöveg túllép a komponens határain. Ez 15%-os olvashatóság csökkenéshez és a felhasználói feladat végrehajtási idejének növekedéséhez vezet. Rendszeres tesztelés a „g", „j", „p", „q", „y" betűket tartalmazó szöveggel segít az ilyen problémák korai felismerésében a fejlesztés során.

Gyakran ismételt kérdések

Miben különbözik a Descender a baseline-tól?

Baseline az a vízszintes vonal, amelyen a betűk állnak, míg a descender a betűnek az e vonal alatt található része. A baseline egy sorra nézve állandó, a descender egy adott betű tulajdonsága. Ne keverjük ezeket a fogalmakat: a baseline az igazításhoz használatos, míg a descender a sorközt befolyásolja, és figyelmet igényel a konténer magasságának beállításakor.

Hogyan tudom meg a betűtípszer descenderét Androidon?

Használjuk a Paint.getFontMetrics().descent metódust a View-rendszerben vagy a TextLayoutResult-ot a Jetpack Compose-ban. Az iOS-szel ellentétben Androidon a descent értéke pozitív, és a baseline-tól a glif alsó határáig tartó távolságot mutatja. A sor teljes alsó határának kiszámításához adjuk hozzá a descent értékét a baseline Y koordinátájához.

Miért különbözik ugyanazon betűtípszer descender iOS-en és Androidon?

A platformok különböző metrika táblákat használnak a betűtípszer fájljából: iOS — hhea.descent, Android — os/2.sTypoDescender. Ha ezek az értékek a betűtípusban eltérnek, a renderelés különbözni fog. Mindig ellenőrizzük mindkét értéket a fontTools segítségével. A minőségi rendszerbetűtípusok (SF Pro, Roboto, Noto) összehangolt metrikákkal rendelkeznek mindkét platformon.

Mekkora a minimális line-height a descender ütközések elkerüléséhez?

A minimális line-height = ascender + descender + 2 px tartalék. A 17 pt rendszerbetűtípus esetében iOS-en ez kb. 22.4 pt. Androidon 16 sp Roboto esetében — kb. 22 sp. Ajánlott a legközelebbi egész számra kerekíteni és ellenőrizni a „gpq" tesztkarakterlánccal — ha nincs ütközés, a line-height elegendő.

Használható-e nagyon hosszú descenderrel rendelkező betűtípus mobilalkalmazásban?

Igen, de megszorításokkal. A hosszú descenderrel rendelkező betűtípusok (Playfair Display, dekoratív betűcsaládok) elfogadhatók címsorokhoz és akcidens szöveghez, ahol a line-height növelhető a dizájn károsítása nélkül. Fő szöveghez a 20–25% em méretű descenderrel rendelkező betűtípusok (SF Pro, Roboto, Inter) ajánlottak a felesleges függőleges hely megtakarítása érdekében.

Összefoglalás

  • Descender — a betű alsó lenyúló eleme a baseline alatt, jelen van a „g", „j", „p", „q", „y" (latin) betűknél.
  • Digitális metrikák — hhea.descent (iOS) és os/2.sTypoDescender (Android) OpenType/TrueType formátumokban.
  • iOS API — UIFont.descender (negatív érték) UIKit-hez és CTFontGetDescent a Core Text-hez.
  • Android API — Paint.FontMetrics.descent (pozitív) és TextLayoutResult Compose-ban.
  • Sorütközések — akkor lépnek fel, ha a line-height kisebb, mint ascender + descender + 2 px tartalék; a „gpq" karakterlánccal ellenőrizhető.
  • Levágódás komponensekben — a gombok, szövegmezők és egyedi konténerek paddingjének meg kell egyeznie a descender abszolút értékével.
  • Platformkülönbség — az iOS és az Android különböző metrika táblákat használ, ami a betűtípus mindkét platformon történő ellenőrzését teszi szükségessé.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is