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, 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-size | descender içeren harf örnekleri |
|---|---|---|
| SF Pro | ~0.22 | g, j, p, q, y — dengeli uzantı |
| Roboto | ~0.24 | g, j, p — orta düzey descender |
| Playfair Display | ~0.30 | g, j, p, q — uzun dekoratif öğeler |
| Inter | ~0.26 | g, j, p — baseline'ın belirgin şekilde altında |
| Noto Sans | ~0.20 | g, 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.
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.
# 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 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.
// 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 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.
// 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.
// 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.
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.
// 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.
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.
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
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.
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.
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.
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.
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
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.
Ayrıca okuyun