Mobil geliştirmede Descender — özü, anlamı ve düzen üzerindeki etkisi

Yazar: IT Sectr Yayınlanma: 2026-07-24 Okuma süresi: 9 dk

Descender, küçük harflerin yazı tipinin taban çizgisinin (baseline) altına uzanan kısmıdır. Latin alfabesinde, descender içeren tipik harfler “g”, “j”, “p”, “q”, “y”dir. Descender'ın uzunluğu, yazı tipinin alt çıkıntı öğesini belirler ve satır aralığının hesaplanması için kritik öneme sahiptir: baseline'ın altında yeterli boşluk olmazsa, descender içeren harfler bir sonraki satırla çarpışır. Material Design Type Scale Guidelines (2025)'e göre, descender'ın yetersiz şekilde dikkate alınması, mobil cihazlarda çok satırlı metinlerde satır çarpışmasının ana nedenlerinden biridir.

Önemli Noktalar

  • Descender — baseline'ın altında bulunan harfin alt çıkıntı öğesi.
  • Metrik — descender'a UIFont.descender (iOS) ve Paint.FontMetrics.descent (Android) üzerinden erişilebilir.
  • Line-height — descender, satırın toplam yüksekliği hesaplamasına dahil edilir ve düzenlemede dikkate alınması gerekir.
  • Satır çarpışmaları — descender dikkate alınmazsa, descender içeren harfler alt satırla çarpışır.
  • Farklı yazı tipleri — descender uzunluğu yazı yüzleri arasında değişir ve görsel ritmi etkiler.

Tipografide Descender Nedir

Descender, bir glifin taban çizgisinin altında bulunan kısmıdır. Harfin ana gövdesi baseline üzerinde dururken, descender bunun ötesine uzanarak yazı tipinin karakteristik siluetini oluşturur. Latin alfabesinde, descender içeren harfler “g”, “j”, “p”, “q”, “y”dir — alt öğeleri çizginin altına iner.

Descender'ın derinliği, baseline'dan glifin alt kenarına (descender-çizgisi) olan mesafeyi tanımlar. Kaliteli yazı tiplerinde bu mesafe dengelidir: çok kısa bir descender, descender içeren harflerin tanınmasını zorlaştırırken, çok uzun bir descender satırlar arasında aşırı boşluk yaratır ve metin yoğunluğunu azaltır. Farklı yazı yüzleri, descender uzunluğunda önemli farklılıklar gösterir.

Yazı YüzüDescender / em-sizedescender içeren harf örnekleri
SF Pro~0.22g, j, p, q, y — dengeli uzantı
Roboto~0.24g, j, p — orta düzey descender
Playfair Display~0.30g, j, p, q — uzun dekoratif öğeler
Inter~0.26g, j, p — baseline'ın belirgin şekilde altında
Noto Sans~0.20g, j — kısa descender, kompakt

Google Fonts Metrics Guide (2025)'e göre, bir descender'ın derinliği tam em boyutunun (1000 FUnits) %20–25'i olduğunda optimal kabul edilir. %15'in altındaki değerler descender içeren harflerin ayırt edilmesini zorlaştırırken, %30'un üzerindeki değerler satır çarpışmalarını önlemek için line-height'in zorunlu olarak artırılmasını gerektirir.

Descender'ın Dijital Metrikleri: OpenType ve TrueType

Dijital yazı tiplerinde, descender metrik tablolarında negatif bir değer olarak saklanır. OpenType formatında bu, hhea.descent alanı (hhea tablosu) ve sTypoDescender'dır (OS/2 tablosu). Her iki değer de negatiftir çünkü baseline'dan aşağıya doğru ölçülürler. TrueType için, OS/2 tablosu usWinDescent alanıyla kullanılır — değeri pozitiftir ancak aynı metriği belirtir.

python
# fontTools aracılığıyla yazı tipinden descender okuma
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)

# 16pt yazı tipi boyutu için piksele dönüştür
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000  # 8 px

Platformlar arasındaki kritik fark: iOS, işleme için hhea.descent kullanır, Android ise OS/2'den sTypoDescender kullanır. Bu değerler farklıysa (kötü yapılandırılmış yazı tiplerinde olduğu gibi), aynı metin iOS ve Android'de farklı satır aralıklarıyla görüntülenir. 100 FUnits'lık bir fark (16 pt yazı tipi boyutunda yaklaşık 1,6 px) görsel olarak fark edilebilir.

Microsoft OpenType Specification v1.9 (2025)'e göre, doğru platformlar arası işleme için, hhea.descent ve sTypoDescender değerleri 50 FUnits hassasiyetinde eşit olmalıdır. Bir mobil uygulama için yazı tipi seçerken, bu fontTools veya benzer bir araçla kontrol edilmelidir.

iOS'ta Descender: UIFont ve Core Graphics

iOS'ta descender değeri UIFont.descender özelliği aracılığıyla kullanılabilir. Bu özellik, baseline'dan yazı tipinin alt kenarına (descender dahil) olan mesafeyi gösteren negatif bir sayı döndürür. Örneğin, 17 pt'de SF Pro için descender değeri yaklaşık -4,2 pt'dir. Mutlak değer ne kadar büyükse, yazı tipinin alt uzantıları o kadar uzun olur.

swift
// iOS'ta UIFont üzerinden descender alma
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender     // ~ -4,2 pt (SF Pro 17pt için)
let ascender = font.ascender        // ~ 16,2 pt
let lineHeight = font.lineHeight    // ~ 20,4 pt

// descender ofseti ile özel işleme
let attrString = NSAttributedString(
    string: "Sample text with letter p and y",
    attributes: [.font: font]
)

// Core Text: descender ile sınırlama kutusu alma
let ctFont = CTFontCreateWithName(
    "SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont)  // ~4,2 pt

TextKit (NSTextStorage, NSLayoutManager) kullanırken descender, lineFragmentPadding ve lineFragmentRect'te otomatik olarak dikkate alınır. Ancak, Core Graphics (draw(in:)) üzerinden özel işleme yaparken, konteynerin alt kenar boşluğuna descender'ın mutlak değerini ekleyerek koordinatları manuel olarak ayarlamanız gerekir. Bu yapılmazsa, descender içeren harfler işleme sınırlarının ötesine geçer ve kırpılır.

Android'te Descender: Paint ve Compose

Android'te descender metrikleri Paint.FontMetrics.descent üzerinden kullanılabilir. iOS'un aksine, descent değeri pozitiftir — baseline'dan metnin alt kenarına olan mesafeyi temsil eder. FontMetrics.bottom özelliği yalnızca descender'ı değil, aynı zamanda yazı tipi tasarımcısı tarafından önerilen ek alanı (leading) da içerir. Yalnızca descender'ın doğru hesaplanması için bottom yerine descent kullanın.

kotlin
// Android'te Paint üzerinden descender alma
val paint = Paint().apply {
    textSize = 17 * density
}

val metrics = paint.fontMetrics
val descent = metrics.descent     // ~4,5 px (17sp için)
val bottom = metrics.bottom       // ~5,0 px (leading ile)

// descender ofseti ile özel işleme
val baseline = y
canvas.drawText("Örnek: gpq", x, baseline, paint)

// descender ile alt sınır
val bottomBound = baseline + descent  // doğru alt sınır

Jetpack Compose'ta descender, TextLayoutResult üzerinden elde edilebilir. getLineBottom yöntemi, zaten descender'ı içeren satırın alt kenarının Y koordinatını döndürür. Farklı yazı tipi boyutlarına sahip dizelerin özel düzenlemesi yapılırken (örneğin, indirimli fiyat ve tam fiyat), descender'ı dikkate alarak baseline hizalaması, alt kenar hizalamasından daha doğru bir sonuç verir.

kotlin
// Compose: metin alt sınırını kontrol etme
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)
            // Descender'ın konteyner sınırlarını aşmadığını kontrol et
        }
    }
)

Google Material Design — Typography Implementation (2025)'e göre, sabit yükseklikteki konteynerlerde descender kırpılmasını önlemek için, mevcut metinde descender harfleri olsun veya olmasın, yazı tipinin descent değerine eşit dikey dolgu eklemeniz gerekir. Bu, metin dinamik olarak değiştirildiğinde arayüzün bozulmamasını sağlar.

Mobil Arayüzlerde Descender ve Satır Çarpışmaları

Satır çarpışması, üst satırdaki bir harfin descender'ının alt satırdaki bir harfin ascender'ı ile fiziksel olarak kesişmesi durumudur. Mobil arayüzlerde bu, özellikle çok satırlı başlıklarda, ürün kartlarında ve küçük satır aralığına sahip metin bloklarında belirgindir. Uzun descender ve küçük line-height'e sahip yazı tipleri kullanıldığında sorun daha da kötüleşir.

Çarpışmaları önleyen minimum line-height şu formülle hesaplanabilir: line-height = ascender + descender + 2 px kenar boşluğu. 17 pt'de SF Pro için bu, yaklaşık 16,2 + 4,2 + 2 = 22,4 pt (yaklaşık 1,32 katsayısı) line-height verir. 16 sp'de Roboto için yaklaşık 1,35. Line-height bu değerden küçükse, descender harfleri içeren metinlerde çarpışma garantidir.

swift
// iOS: çarpışmaları önlemek için minimum line-height hesapla
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
    ]
)

Dekoratif ve el yazısı yazı tipleriyle çalışırken özellikle dikkatli olunmalıdır — descender'ları em boyutunun %35–40'ına ulaşabilir. Bu tür yazı tipleri nadiren gövde metni için kullanılır ancak başlıklarda uygulanabilir. Bir başlıkta uzun descender'a sahip bir harfin tek bir görünümü bile komşu arayüz öğesiyle çarpışmaya neden olabilir.

Descender ile Çalışırken Yaygın Hatalar

En yaygın hata, düğmelerde ve metin alanlarında descender'ın kırpılmasıdır. Bir düğmenin veya metin alanının yüksekliğini descender'ı dikkate almadan line-height'e eşit olarak ayarladığımızda, descender içeren harfler alt kenardan kesilir. Bu, özellikle descender'ın köe yarıçapı sınırının ötesine geçebileceği yuvarlatılmış köşeli sistem düğmelerinde belirgindir.

  • Sabit yükseklikteki düğmeler — düğme yüksekliği ceil(line-height)'e eşitse, descender içeren harfler kırpılır. Çözüm: üst ve alt dolgu için düğme yüksekliğini descender'ın mutlak değeri kadar (17 pt sistem yazı tipi için 4–5 pt) artırın.
  • Descender dikkate alınmayan TextField — standart UITextField ve EditText, descender'ı dikkate alan dolguya sahiptir, ancak özel uygulamalar genellikle bunu unutur. İmlecin ve metin bloğunun descender harflerini kırpmadığını kontrol edin.
  • Aynı satırda yazı tipi boyutlarını karıştırma — NSAttributedString veya SpannableString farklı yazı tipi boyutlarına sahip segmentler içeriyorsa, büyük yazı tipinin descender'ı küçük yazı tipinin ascender'ı ile örtüşebilir. Telafi için baselineOffset kullanın ve sonucu doğrulayın.
  • SVG metin işleme — SVG veya Canvas'ta (özellikle web view'larda) metin işlerken, descender otomatik olarak dikkate alınmayabilir. Her zaman yazı tipi boyutunun %10–15'i kadar kenar boşluğuna sahip açık bir viewBox belirtin.

Nielsen Norman Group — Mobile Typography Research (2025)'e göre, mobil uygulamaların %41'i, descender içeren metnin bileşen sınırlarını aştığı en az bir ekrana sahiptir. Bu, okunabilirlikte %15 azalmaya ve kullanıcının görev tamamlama süresinde artışa yol açar. Descender harfleri içeren metinle düzenli test yapmak, geliştirmenin erken aşamalarında bu tür sorunları belirlemeye yardımcı olur.

Sıkça Sorulan Sorular

Descender, baseline'dan nasıl farklıdır?

Baseline, harflerin üzerinde durduğu yatay çizgidir, descender ise bu çizginin altında bulunan harf kısmıdır. Baseline satır için bir sabittir, descender belirli bir harfin özelliğidir. Bu kavramları karıştırmayın: baseline hizalama için kullanılırken, descender satır aralığını etkiler ve konteyner yüksekliği ayarlanırken dikkate alınmalıdır.

Android'te bir yazı tipinin descender'ını nasıl öğrenebilirim?

View sistemi için Paint.getFontMetrics().descent veya Jetpack Compose'ta TextLayoutResult kullanın. iOS'un aksine, Android'te descent değeri pozitiftir ve baseline'dan glifin alt kenarına olan mesafeyi gösterir. Satırın tam alt sınırını hesaplamak için baseline'ın Y koordinatına descent ekleyin.

Aynı yazı tipinin descender'ı neden iOS ve Android'te farklıdır?

Platformlar, yazı tipi dosyasından farklı metrik tabloları kullanır: iOS hhea.descent kullanır, Android ise os/2.sTypoDescender kullanır. Bu değerler yazı tipinde farklıysa, işleme farklı olacaktır. fontTools aracılığıyla her iki değeri de kontrol edin. Kaliteli sistem yazı tipleri (SF Pro, Roboto, Noto) her iki platform için de tutarlı metriklere sahiptir.

Descender çarpışmalarını önlemek için gereken minimum line-height nedir?

Minimum line-height = ascender + descender + 2 px kenar boşluğu. iOS'ta 17 pt sistem yazı tipi için bu yaklaşık 22,4 pt'dir. Android'te 16 sp Roboto için yaklaşık 22 sp. En yakın tam sayıya yuvarlamanız ve descender harflerinden oluşan bir test dizesiyle kontrol etmeniz önerilir — çarpışma yoksa line-height yeterlidir.

Mobil uygulamada çok uzun descender'a sahip bir yazı tipi kullanılabilir mi?

Evet, ancak bazı çekincelerle. Uzun descender'a sahip yazı tipleri (Playfair Display, dekoratif yazı yüzleri), tasarımdan ödün vermeden line-height'in artırılabileceği başlıklar ve vurgu metinleri için kabul edilebilir. Gövde metni için, dikey alanı boşa harcamamak adına em boyutunun %20–25'i kadar descender'a sahip yazı tipleri (SF Pro, Roboto, Inter) tercih edilir.

Özet

  • Descender — baseline'ın altında bulunan harfin alt çıkıntı öğesi, Latin harfleri “g”, “j”, “p”, “q”, “y”de bulunur.
  • Dijital metrikler — OpenType/TrueType formatlarında hhea.descent (iOS) ve os/2.sTypoDescender (Android).
  • iOS API — UIKit için UIFont.descender (negatif değer) ve Core Text için CTFontGetDescent.
  • Android API — Paint.FontMetrics.descent (pozitif) ve Compose'ta TextLayoutResult.
  • Satır çarpışmaları — line-height < ascender + descender + 2 px kenar boşluğu olduğunda oluşur; descender harflerinin test dizesiyle doğrulanır.
  • Bileşenlerde kırpılma — düğmeler, metin alanları ve özel konteynerler, descender'ın mutlak değerine eşit dolguya sahip olmalıdır.
  • Platform farklılıkları — iOS ve Android farklı metrik tabloları kullanır, bu da yazı tipinin her iki platformda da kontrol edilmesini gerektirir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun