Font Descriptor: yazı tipi tanımlayıcısının temel kavramları ve yetenekleri

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

Font Descriptor, iOS'ta UIFontDescriptor ve macOS'ta NSFontDescriptor nesnesidir ve tüm yazı tipi meta verilerini kapsüller: aile, yazı yüzü, boyut, karakter aralığı, satır aralığı ve tipografik öznitelikler. Doğrudan UIFont(name:size:) ile bir yazı tipi oluşturmak yerine, geliştirici tanımlayıcı aracılığıyla istenen özellikleri tanımlar ve sistem mevcut yazı tiplerinden en iyi eşleşimi seçer. Apple Geliştirici Dokümantasyonu'na göre UIFontDescriptor, 20'den fazla yazı tipi özniteliğini destekler ve UIKit'ten Core Text ve SwiftUI'ye kadar tüm iOS tipografi çerçevelerinde kullanılır.

Temel Noktalar

  • Font Descriptor — aile, yazı yüzü, boyut ve tipografik öznitelikler hakkında meta veriler içeren bir tanımlayıcı nesne
  • Somut bir yazı tipi adı belirtmeden bir dizi öznitelikten UIFont oluşturmaya olanak tanır
  • Mevcut bir yazı tipinin değiştirilmesini destekler: yeni bir nesne oluşturmadan boyut, yazı yüzü ve kerning değiştirme
  • Yazı tipi arama ve yapılandırma için UIKit, Core Text ve SwiftUI'de kullanılır
  • Yazı tipi eşleştirme sağlar — en yakın mevcut yazı yüzünün otomatik seçimi

Font Descriptor nedir ve neden gereklidir

Font Descriptor, belirli bir yazı tipi dosyası yerine anahtar-değer çiftleri kümesi olarak yazı tipi özelliklerini tanımlayan bir nesnedir. Geliştirici, ada göre yazı tipi oluşturmak yerine aile, yazı yüzü, boyut ve isteğe bağlı öznitelikleri belirtir ve sistem en iyi eşleşimi seçer. Bu yaklaşım uyarlanabilir tipografi için kritiktir: aynı tanımlayıcı, mevcut yazı tipleri kümesinin farklılık gösterdiği farklı iOS sürümlerinde çalışabilir. iOS Kullanıcı Arayüzü Yönergeleri'ne göre, tanımlayıcılar aracılığıyla yazı tipi eşleştirme, dinamik yazı tipleriyle çalışmanın önerilen yoludur.

Font Descriptor olmadan, geliştiriciler her yazı tipinin kullanılabilirliğini ada göre kontrol etmek ve manuel olarak yedek seçenekler tanımlamak zorunda kalırdı. Tanımlayıcı bu süreci otomatikleştirir: yazı yüzleri için bir uyumluluk matrisi (normal, kalın, italik, kalın italik) içerir ve tam bir eşleşme bulunamadığında en yakın kullanılabilir olanı döndürür. Sistem eşleştirmesi Core Text düzeyinde çalışır ve birleşik NSFontDescriptor API'si aracılığıyla hem iOS hem de macOS'ta kullanılabilir.

Tanımlayıcılar özel yazı tipleri için de kullanılır — Info.plist aracılığıyla yüklenen veya manuel olarak eklenen. Bir yazı tipi sistemde kayıtlıysa, tanımlayıcısı sistem yazı tipiyle tamamen aynı şekilde oluşturulur. Platformlar arası not: tanımlayıcı kavramı Android'de Typeface.Builder aracılığıyla da mevcuttur, ancak UIFontDescriptor aracılığıyla iOS uygulaması önemli ölçüde daha fazla öznitelik sağlar — Android'de 5'e kıyasla 20'den fazla.

Font Descriptor'ın temel özellikleri ve öznitelikleri

UIFontDescriptor, [UIFontDescriptor.AttributeName: Any] türünde bir fontAttributes sözlüğünde gruplanmış öznitelikler içerir. Anahtar öznitelikler arasında yazı tipi ailesi, adı, boyutu, özellikleri (traits), dönüşüm matrisi, optik boyut ve metin stili bulunur. Apple WWDC 2019 Oturum 227'ye göre, metin stillerinin (Dynamic Type) kullanımı erişilebilirlik uyumlu uygulamalar için zorunludur.

traits özniteliği, sembolik özellikler içeren bir sözlüktür: ağırlık (UIFontWeightTrait), eğim (UIFontSlantTrait), genişlik (UIFontWidthTrait) ve diğerleri. Bu değerler, yazı tipi eşleştirici tarafından bir yazı yüzü seçmek için kullanılır. Örneğin, UIFontWeightTrait değeri 0.0 — normal yazı yüzü, 0.3 — kalın. Sistem sayısal değerleri otomatik olarak mevcut yazı tipi varyantlarına eşeler.

Ek öznitelikler arasında OpenType özellikleri için featureSettings (bitişikler, kerning, sayı oranları), kullanıcıya gösterim için visibleName, yazı tipinin afin dönüşümleri için matrix ve basamaklı yedek yazı tipi listeleri için cascadeList bulunur. Özniteliklerin tam listesi, iOS ve macOS'taki neredeyse tüm tipografi senaryolarını kapsar.

ÖznitelikTürAçıklama
UIFontDescriptorFamilyStringYazı tipi ailesi (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringTam yazı tipi adı (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberPunto cinsinden yazı tipi boyutu
UIFontDescriptorMatrixNSValueAfin dönüşüm matrisi
UIFontDescriptorTraits[String: Any]Yazı yüzünün sembolik özellikleri
UIFontDescriptorTextStyleStringDynamic Type stili (headline, body, caption)

Swift'te Font Descriptor aracılığıyla UIFont oluşturma

iOS'ta Font Descriptor ile çalışmanın birincil yolu, bir tanımlayıcı oluşturmak ve ardından ondan bir UIFont üretmektir. Bu, tam adını bilmeden belirli özelliklere sahip bir yazı tipine ihtiyaç duyulduğunda tercih edilen yaklaşımdır. Süreç iki adımdan oluşur: bir başlatıcı aracılığıyla UIFontDescriptor oluşturmak ve tanımlayıcıda font(withSize:) yöntemini çağırmak.

swift
import UIKit

// Aile için yazı tipi tanımlayıcısı oluştur
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Tanımlayıcıdan UIFont oluştur
let font = descriptor.font(withSize: 17)

Bu yaklaşım, sistemin mevcut cihazda SF Pro'nun kalın yazı yüzü için en iyi eşleşimi seçmesini garanti eder. Anahtar avantaj — kod iOS sürümüne bağlı değildir: iOS 13'te SF Pro kullanılır; önceki sürümlerde Helvetica Neue veya varsayılan sistem yazı tipi kullanılır.

Dinamik boyuta sahip bir yazı tipi oluşturmak için, metin stili ve ölçek ile başlatıcıyı kullanın. Dynamic Type, kullanıcı ayarlarına göre boyutu otomatik olarak ayarlar:

swift
// Dynamic Type tanımlayıcısı
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Yazı tipini kalın yap
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Dinamik boyutu koruyarak UIFont oluştur
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Önemli: withSymbolicTraits yöntemi isteğe bağlı bir tanımlayıcı döndürür — istenen yazı yüzü mevcut değilse nil döndürür. Kullanmadan önce her zaman isteğe bağlıyı kontrol edin.

Ekleme ve değiştirme yoluyla öznitelikleri değiştirme

Font Descriptor değiştirilemez bir modeli destekler — her değişiklik yöntemi, değiştirilen öznitelikle birlikte yeni bir tanımlayıcı döndürür. Bu, değer semantiğini takip eder ve kodu öngörülebilir kılar: orijinal tanımlayıcı asla değişmez. Ana değişiklik yöntemleri şunlardır: öznitelik eklemek için addingAttributes, yazı yüzünü değiştirmek için withFace, boyutu değiştirmek için withSize ve afin dönüşüm için withMatrix.

addingAttributes yöntemi en esnek olanıdır. Bir öznitelik sözlüğü alır ve yeni bir tanımlayıcı döndürür. Anahtarlar eşleştiğinde, yeni değerler eskilerinin yerini alır. Bu, değişiklikleri birleştirmeye olanak tanır: tek bir çağrıda ağırlık ekleme, boyut değiştirme ve bitişikleri etkinleştirme. Apple Teknik Soru-Cevap QA1682'ye göre addingAttributes, uzantı aracılığıyla toplu değişiklik için önerilen yoldur.

Pratik kullanım durumu: bir kod düzenleyicide tek aralıklı metin için yazı tipi oluşturma. Geliştirici sistem tek aralıklı tanımlayıcısını alır, ince çizgiler için azaltılmış ağırlık ekler ve featureSettings aracılığıyla karakter aralığını artırır. Bu, ayrı bir yazı tipi yüklemeden daha okunabilir kod sağlar.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Özel öznitelikler ekle
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

let monoFont = UIFont(
    descriptor: customDescriptor,
    size: 14
)

Sınırlama: Tanımlayıcıyı oluşturduktan sonra tüm öznitelikler değiştirilemez. Örneğin, yazı tipi ailesi başlatma sırasında bir kez ayarlanır. Aileyi değiştirmeniz gerekiyorsa, yeni bir tanımlayıcı oluşturun. Bu, tanımlayıcının belirli bir yazı tipi kaynağına bağlı olduğu Core Text mimarisiyle ilgilidir.

Yazı tipi eşleştirme ve sistem yazı tiplerini arama

Yazı tipi eşleştirme, Font Descriptor'ın yüklü yazı tipleri arasından istenen öznitelikler için otomatik olarak en iyi eşleşimi seçen temel bir özelliğidir. Süreç üç aşamadan oluşur: filtreleme (uyumsuz yazı tiplerini hariç tutma), sıralama (eşleşme derecesine göre sıralama) ve seçim (en iyi sonucu döndürme). Eşleştirme, tüm iOS tipografisinin temelini oluşturan çerçeve olan Core Text düzeyinde gerçekleştirilir.

Bir tanımlayıcıyla eşleşen tüm yazı tiplerini bulmak için matchingFontDescriptors yöntemini kullanın. Alaka düzeyine göre sıralanmış bir tanımlayıcı dizisi döndürür. Geliştirici tam eşleşimi (ilk öğe) seçebilir veya özel mantık için seçenekler arasında gezinilebilir. Apple Yazı Tipi Kullanım Kılavuzu'na göre, ada göre numaralandırmadan belirli bir aile için mevcut yazı yüzlerinin bir listesini almanın tek yolu budur.

Kullanım durumu: bir metin ayarları arayüzünde yazı tipi seçerken. Kullanıcı bir aile seçer ve uygulama, tüm mevcut yazı yüzlerini almak ve bunları bir seçicide görüntülemek için matchingFontDescriptors kullanır. Eşleştirme olmadan, geliştiriciler iOS sürümleri arasında değişen bir seçenek listesini sabit kodlamak zorunda kalırdı.

swift
let searchDescriptor = UIFontDescriptor.init(
    fontAttributes: [.family: "SF Mono"]
)

// Mevcut tüm yazı yüzlerini al
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

for descriptor in matchingDescriptors {
    print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}

Zorunlu anahtarlar — aramayı kısıtlayan bir parametre. [.family] belirtirseniz, eşleştirme belirtilen ailenin tüm yazı tiplerini döndürür. [.family, .traits] belirtirseniz — yalnızca hem aile hem de yazı yüzüyle eşleşenler. Zorunlu anahtarların kullanımı, bir yazı tipi alt kümesini ararken eşleştirmeyi hızlandırır.

Performans: eşleştirme, iOS'ta 0,5 ila 5 ms süren senkron bir işlemdir. Tek bir arama için bu ihmal edilebilir düzeydedir, ancak tanımlayıcılar üzerinde toplu yineleme için (50'den fazla yazı tipine sahip bir seçicide olduğu gibi), sonuçların önbelleğe alınması önerilir. Apple, ekran yüklenirken bir kez eşleştirme yapılmasını ve tanımlayıcı dizisinin kaydedilmesini önerir.

Core Text ve CTFontDescriptor ile entegrasyon

Core Text, iOS ve macOS'ta tipografi ile çalışmak için düşük seviyeli C tabanlı bir çerçevedir. UIFontDescriptor'ın karşılığı CTFontDescriptor'dır ve Core Foundation düzeyinde aynı yetenekleri sağlar. CTFontDescriptor, yazı tipleri oluşturmak, metin ölçmek ve karmaşık tipografi oluşturmak için Core Text API'lerinde kullanılır. UIFontDescriptor, genişletilmiş bir öznitelik kümesiyle CTFontDescriptor etrafında bir Objective-C sarmalayıcısıdır.

UIFontDescriptor ve CTFontDescriptor arasındaki toll-free köprüleme, dönüştürme olmadan UIKit ve Core Text arasında tanımlayıcıların iletilmesine olanak tanır. Bu, özel metin oluşturma kullanan uygulamalar için kritiktir — örneğin, TextKit tabanlı metin düzenleyiciler veya sözdizimi vurgulamalı kod düzenleyicileri. Örnek: CTFontDescriptorCreateCopyWithAttribute, eklenen bir öznitelikle tanımlayıcının bir kopyasını oluşturur — UIFontDescriptor'daki addingAttributes'ın bir benzeri.

CTFontDescriptor içindeki anahtar öznitelik kCTFontURLAttribute, yazı tipi dosyasının URL'sini içerir. Bu, bir yazı tipinin sistem mi yoksa özel mi olduğunu belirlemeye olanak tanır. Özel yazı tipleri için URL, yazı tipi dosyasını (.ttf veya .otf) gösterir; sistem yazı tipleri için sistem yazı tipi dizinini gösterir. Tanımlayıcı aracılığıyla veriler salt okunurdur; URL aracılığıyla yazı tipi dosyasının değiştirilmesi desteklenmez.

Gelişmiş tipografi için — özel bitişikler, bağlamsal değiştirmeler, alternatif glifler — kCTFontFeatureSettingsAttribute anahtarıyla CTFontDescriptorCopyAttribute kullanın. Bu öznitelik, tanımlayıcı aracılığıyla eklenebilecek OpenType özellik sözlüklerinden oluşan bir dizi içerir. Apple Core Text Programlama Kılavuzu'na göre, UIFontDescriptor'ı Core Text ile birleştirmek, uygulama tipografisi üzerinde tam kontrol sağlar.

Sıkça Sorulan Sorular

Font Descriptor, UIFont'tan nasıl farklıdır?

UIFont, metni oluşturan kullanıma hazır bir yazı tipidir. Font Descriptor bir yazı tipi tanımıdır — içinden UIFont oluşturulabilen bir öznitelik kümesidir. Tek bir tanımlayıcı, farklı boyutlarda birden çok UIFont üretebilir.

Font Descriptor özel yazı tipleri için kullanılabilir mi?

Evet. Yazı tipi sistemde kayıtlıysa (Info.plist veya Core Graphics aracılığıyla), tanımlayıcısı sistem yazı tiplerinde olduğu gibi aile veya ad ile oluşturulur. Eşleştirme, kayıtlı tüm yazı tipleri için çalışır.

Tanımlayıcıdan yazı tipi adını nasıl alırım?

Görüntülenen adı almak için descriptor.object(forKey: .visibleName) veya PostScript adı için descriptor.postscriptName kullanın. PostScript adı, UIFont(name:size:) aracılığıyla yazı tipi oluştururken kullanılır.

Font Descriptor'da basamaklı liste nedir?

Basamaklı liste, yedek yazı tipleri olarak görev yapan iç içe tanımlayıcılardan oluşan bir dizidir. Birincil yazı tipi gerekli bir karakteri içermiyorsa, sistem basamaklı listedeki yazı tiplerini sırayla kontrol eder. Emoji ve CJK karakter desteği için kullanılır.

Font Descriptor SwiftUI'de çalışır mı?

Evet. SwiftUI, Font(descriptor:size:) aracılığıyla Font Descriptor'ı destekler. SwiftUI sarmalayıcısı bir UIFontDescriptor kabul eder ve tüm tanımlayıcı özniteliklerini — kerning, bitişikler ve yazı yüzü — koruyarak bir SwiftUI yazı tipi oluşturur.

Özet

  • Font Descriptor — aile, yazı yüzü, boyut ve tipografik özelliklerin özniteliklerine sahip bir tanımlayıcı nesne
  • Otomatik yazı tipi eşleştirme ile bir dizi öznitelikten UIFont oluşturmaya olanak tanır
  • addingAttributes, withSize, withSymbolicTraits aracılığıyla değiştirilemez değişiklik destekler
  • matchingFontDescriptors, yazı tipi arama ve seçimi için mevcut tüm yazı yüzlerini döndürür
  • UIFontDescriptor ve CTFontDescriptor arasındaki toll-free köprüleme aracılığıyla Core Text ile entegre olur
  • Tercih edilen metin stilleri ve ölçeklendirme aracılığıyla Dynamic Type destekler
  • Yazı tipi kullanılabilirliğini kontrol etmeden tüm iOS sürümlerini destekleyen uyarlanabilir tipografi için önerilir

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