Font Descriptor: şrift deskriptorunun əsas anlayışları və imkanları

Müəllif: IT Sectr Dərc olunub: 2026-07-23 Oxuma vaxtı: 9 dəq

Font Descriptor — iOS-da UIFontDescriptor və macOS-da NSFontDescriptor obyektidir, şriftin bütün metadatanı əhatə edir: ailə, üz şekli, ölçü, hərflərarası boşluq, sətirlərarası boşluq və tipoqrafiya atributları. Birbaşa UIFont(name:size:) vasitəsilə şift yaratmaq əvəzinə, tərtibatçı istənilən xarakteristikaları deskriptor vasitəsilə təsvir edir və sistem mövcud şiftlərdən ən yaxşı uyğunluğu seçir. Apple Developer Documentation-a görə, UIFontDescriptor 20-dən çox şift atributunu dəstəkləyir və iOS tipoqrafiya çərçivələrinin hamısında — UIKit-dən Core Text və SwiftUI-yə qədər istifadə olunur.

Əsas məqamlar

  • Font Descriptor — ailə, üz şekli, ölçü və tipoqrafiya atributları haqqında metadataya malik şift təsviredici obyekti
  • Xüsusi şift adını göstərmədən UIFont yaratmağa imkan verir
  • Mövcud şiftin modifikasiyasını dəstəkləyir: ölçü, üz şekli, kerning dəyişikliyi yeni obyekt yaratmadan
  • UIKit, Core Text və SwiftUI-də şift axtarışı və konfiqurasiyası üçün istifadə olunur
  • Şift uyğunlaşdırmasını təmin edir — mövcud ən yaxın üz şeklinin avtomatik seçimi

Font Descriptor nədir və nə üçün lazımdır

Font Descriptor — şiftin xarakteristikalarını konkret şift faylı kimi deyil, açar-dəyər cütləri dəsti kimi təsvir edən obyektdir. Şifti adı ilə yaratmaq əvəzinə, tərtibatçı ailəni, üz şeklini, ölçünü və isteğə bağlı atributları təyin edir, sistem isə ən yaxşı uyğunluğu seçir. Bu yanaşma adaptiv tipoqrafiya üçün vacibdir: eyni deskriptor mövcud şiftlər dəstinin fərqli olduğu müxtəlif iOS versiyalarında işləyə bilər. iOS Human Interface Guidelines-ə görə, deskriptorlar vasitəsilə şift uyğunlaşdırması dinamik şiftlərlə işləmək üçün tövsiyə olunan üsuldur.

Font Descriptor olmadan tərtibatçı hər şiftin mövcudluğunu adı ilə yoxlamalı və əvəz variantları əl ilə təyin etməli olardı. Deskriptor bu prosesi avtomatlaşdırır: o, üz şkillərinin uyğunluq matrisasını ehtiva edir — normal, qalın, kursiv, qalın kursiv — və dəqiq uyğunluq olmadıqda ən yaxın mövcud olanı qaytarır. Sistem uyğunlaşdırması Core Text səviyyəsində işləyir və həm iOS, həm də macOS-da vahid NSFontDescriptor API vasitəsilə mövcuddur.

Deskriptorlar hççinin fərdi şiftlər üçün də istifadə olunur — Info.plist vasitəsilə yüklənmiş və ya əl ilə əlavə edilmiş. Əgər şift sistemdə qeydiyyatdan keçibsə, onun deskriptoru sistem şifti kimi eyni şəkildə yaradılır. Platformalararası qeyd: deskriptor konsepsiyası Android-də Typeface.Builder vasitƏsilə də mövcuddur, lakin iOS-un UIFontDescriptor vasitəsilə həyata keçirilməsi əhəmiyyətli dərəcədə daha çox atribut verir — Android-də 5-ə qarşı 20-dən çox.

Font Descriptor’ın əsas xüsusiyyətləri və atributları

UIFontDescriptor [UIFontDescriptor.AttributeName: Any] tipli fontAttributes lüğətində qruplaşdırılmış atributları ehtiva edir. Əsas atributlara şift ailəsi (family), adı (name), ölçüsü (size), üz şekli (traits), transformasiya matrisi (matrix), optik ölçü (opticalSize) və mətn stili (textStyle) daxildir. Apple WWDC 2019 Session 227-yə görə, mətn stillərinin — Dynamic Type — istifadəsi accessibility uyğun tətbiqlər üçün məcburidir.

Traits atributu — simvol xarakteristikalarını ehtiva edən lüğətdir: qalınlıq (UIFontWeightTrait), kursiv (UIFontSlantTrait), en (UIFontWidthTrait) və s. Bu dəyərlər şift uyəşdiricisi tərəfindən üz şeklinin seçilməsi üçün istifadə olunur. Məsələn, 0.0 dəyərində UIFontWeightTrait — normal üz şekli, 0.3 — qalın. Sistem çoxlu dəyərləri avtomatik olaraq mövcud şift variantlarına xəritələyir.

Əlavə atributlara OpenType xüsusiyyətləri (liqaturalar, kerning, rəqəm nisbətləri) üçün featureSettings, istifadəçiyə göstərmək üçün visibleName, şiftin afin transformasiyaları üçün matrix və ehtiyat şiftlərin kaskad siyahıları üçün cascadeList daxildir. Atributların tam siyahısı iOS və macOS-da tipoqrafiyanın bütün ssenarilərini əhatə edir.

AtributTipTəsvir
UIFontDescriptorFamilyStringŞift ailəsi (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringŞiftin tam adı (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberNöqtələrlə şift ölçüsü
UIFontDescriptorMatrixNSValueAfin transformasiya matrisi
UIFontDescriptorTraits[String: Any]Üz şeklinin simvol xüsusiyyətləri
UIFontDescriptorTextStyleStringDynamic Type stili (headline, body, caption)

Swift-də Font Descriptor vasitəsilə UIFont yaradılması

iOS-da Font Descriptor ilə işləməyin əsas üsulu — deskriptorun yaradılması və sonra UIFont-un generasiyası. Bu, dəqiq adı bilmədən müəyyən xüsusiyyətlərə malik şift əldə etmək lazım olduqda üstünlük verilən yanaşmadır. Proses iki addımdan ibarətdir: UIFontDescriptor-ın inisializator vasitəsilə yaradılması və deskriptorda font(withSize:) metodunun çağırılması.

swift
import UIKit

// Ailə üçün şift deskriptoru yaradın
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Deskriptordan UIFont yaradın
let font = descriptor.font(withSize: 17)

Bu yanaşma sistemin cari cihazda SF Pro-nun qalın üz şekli üçün ən yaxşı uyğunluğu seçəcəyini təmin edir. Əsas üstünlük — kod iOS versiyasından asılı deyil: iOS 13-də SF Pro, köhnə versiyalarda isə Helvetica Neue və ya standart sistem şifti istifadə olunacaq.

Dinamik ölçülü şift yaratmaq üçün mətn stili və miqyaslı inisializator istifadə olunur. Dynamic Type ölçünü avtomatik olaraq istifadəçi parametrlərinə uyğunlaşdırır:

swift
// Dynamic Type deskriptoru
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Şifti qalın et
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Dinamik ölçünü qoruyaraq UIFont yaradın
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Vacib: withSymbolicTraits metodu isteğə bağlı deskriptor qaytarır — tələb olunan üz şekli mövcud deyilsə, nil qaytarılır. İstifadə etməzdən əvvəl həmişə opsionalı yoxlayın.

Atributların əlavə və dəyişdirmə yolu ilə modifikasiyası

Font Descriptor dəyişməz modeli dəstəkləyir — hər modifikasiya metodu dəyişdirilmiş atributla yeni deskriptor qaytarır. Bu dəyər semantikasına uyğundur və kodu proqnozlaşdırıla bilən edir: orijinal deskriptor heç vaxt dəyişmir. Əsas modifikasiya metodları: atributları əlavə etmək üçün addingAttributes, üz şeklini dəyişmək üçün withFace, ölçünü dəyişmək üçün withSize, afin transformasiya üçün withMatrix.

addingAttributes metodu — ən çevik olanı. O, atributlar lüğətini qəbul edir və yeni deskriptor qaytarır. Açarlar üst-üstə düşdükdə yeni dəyğrlər köhnələri əvəz edir. Bu, dəyişiklikləri birləşdirməyə imkan verir: çəkini artırmaq, ölçünü dəyişmək və liqaturaları bir çağırışla aktivləşdirmək. Apple Technical Q&A QA1682-yə görə, addingAttributes genişləndirmə vasitəsilə kütləvi modifikasiya üçün tövsiyə olunan üsuldur.

Praktik tətbiq: kod redaktorunda monospaced mətn üçün şift yaradılması. Tərtibatçı sistem monospace deskriptorunu götürür, nazik xətlər üçün azaldılmış çəki əlavə edir və featureSettings vasitəsilə hərflərarası boşluğu artırır. Bu, ayrıca şift yükləmədən daha oxunaqlı kod verir.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Fərdi atributlar əlavə edin
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

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

Məhdudiyyət: bütün atributlar deskriptor yaradıldıqdan sonra dəyişdirilə bilməz. Məsələn, şift ailəsi (family) inisializasiya zamanı bir dəfə təyin edilir. Ailəni dəyişmək lazımdırsa, yeni deskriptor yaradın. Bu, Core Text arxitekturası ilə bağlıdır, burada deskriptor konkret şift resursuna bağlıdır.

Şift uyğunlaşdırması və sistem şiftlərinin axtarışı

Şift uyğunlaşdırması — Font Descriptor-un əsas funksiyasıdır, quraşdırılmış şiftlər arasından tələb olunan atributlara ən yaxşı uyğunluğu avtomatik seçir. Proses üç mərhələdən ibarətdir: filtrləmə (uyğunsuz şiftlərin kənarlaşdırılması), sıralama (uyğunluq dərəcəsinə görə çeşid) və seçim (ən yaxşı nəticənin qaytarılması). Uyğunlaşdırma Core Text səviyyəsində yerinə yetirilir — bu, bütün iOS tipoqrafiyasının əsasında duran çərçivədir.

Deskriptora uyğun bütün şiftləri axtarmaq üçün matchingFontDescriptors metodundan istifadə olunur. O, uyğunluğa görə sıralanmış deskriptorlar massivi qaytarır. Tərtibatçı dəqiq uyğunluğu (birinci elementi) seçə və ya fərdi məntiq üçün variantları nəzərdən keçirə bilər. Apple Font Handling Guide-ə görə, bu, müəyyən ailə üçün mövcud üz şkillərinin siyahısını adla sadalamadan əldə etməyin yeganü üsuludur.

İstifadə ssenarisi: mətn parametrləri interfeysində şift seçimi. İstifadəçi ailəni seçir və tətbiq matchingFontDescriptors vasitəsilə bütün mövcud üz şkillərini əldə edərək onları picker-də göstərir. Uyğunlaşdırma olmadan iOS versiyaları arasında dəyişən variantların siyahısını sərt kodlaşdırmaq lazım gələrdi.

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

// Bütün mövcud üz şkillərini əldə edin
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

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

Mandatory keys — axtarışı məhdudlaşdıran parametr. [.family] göstərilərsə, uyğunlaşdırma göstərilən ailənin bütün şiftlərini qaytarır. [.family, .traits] göstərilərsə — yalnız ailəyə və üz şeklinə uyğun olanları. Mandatory keys istifadəsi şift alt dəstini axtararkən uyğunlaşdırmanı sürətləndirir.

Məhsuldarlıq: uyğunlaşdırma iOS-da 0.5 ilə 5 ms arasında çəkən sinxron əməliyyatdır. Tək axtarış üçün bu nəzərə çarpmır, lakin deskriptorların kütləvi nəzərdən keçirilməsi zamanı (məsələn, 50+ şiftli picker-də) nəticələrin keşlənməsi tövsiyə olunur. Apple ekran yüklərkən uyğunlaşdırmanı bir dəfə yerinə yetirməyi və deskriptorlar massivini saxlamağı tövsiyə edir.

Core Text və CTFontDescriptor ilə inteqrasiya

Core Text — iOS və macOS-da tipoqrafiya ilə işləmək üçün aşağı səviyyəli C çərçivəsidir. Onun UIFontDescriptor analoqu — CTFontDescriptor Core Foundation səviyyəsində eyni imkanları təmin edir. CTFontDescriptor Core Text API-də şift yaratmaq, mətni ölçmək və mürəkkəb tipoqrafiyanı göstərmək üçün istifadə olunur. UIFontDescriptor mahiyyətcə CTFontDescriptor üzərində genişləndirilmiş atribut dəsti ilə Objective-C örtüyüdür.

UIFontDescriptor və CTFontDescriptor arasında Toll-free bridging deskriptorların UIKit və Core Text arasında çevirmə olmadan ötürülməsinə imkan verir. Bu, fərdi mətn renderinqindən istifadə edən tətbiqlər — məsələn, TextKit əsaslı mətn redaktorları və ya sintaksis vurğulamalı kod redaktorları üçün vacibdir. Nümunə: CTFontDescriptorCreateCopyWithAttribute əlavə edilmiş atributla deskriptorun surətini yaradır — UIFontDescriptor-dən addingAttributes-in analoqu.

CTFontDescriptor-da kCTFontURLAttribute açar atributu şift faylının URL-ni ehtiva edir. Bu, şiftin sistem və ya fərdi olduğunu müəyyən etməyə imkan verir. Fərdi şiftlər üçün URL şift faylına (.ttf və ya .otf) aparır, sistem şiftləri üçün isə sistem şift qovluğuna. Deskriptor vasitəsilə məlumatlar yalnız oxumaq üçündür; URL vasitəsilə şift faylının dəyişdirilməsi dəstəklənmir.

Qabaqcıl tipoqrafiya — fərdi liqaturalar, kontekst dəyişdirmələr, alternativ gliflər — üçün kCTFontFeatureSettingsAttribute açarı ilə CTFontDescriptorCopyAttribute istifadə olunur. Bu atribut deskriptor vasitəsilə əlavə edilə bilən OpenType xüsusiyyətlərinin lüğətlər massivini ehtiva edir. Apple Core Text Programming Guide-ə görə, UIFontDescriptor və Core Text-in birləşdirməsi tətbiqin tipoqrafiyası üzərində tam nəzarət verir.

Tez-tez verilən suallar

Font Descriptor UIFont-dən nə ilə fərqlənir?

UIFont — mətni göstərən hazır şiftdir. Font Descriptor — şiftin təsviri, UIFont yaratmaq üçün atributlar dəstidir. Bir deskriptor müxtəlif ölçülərdə çoxlu UIFont yarada bilər.

Font Descriptor fərdi şiftlər üçün istifadə edilə bilərmi?

Bəli. Əgər şift sistemdə qeydiyyatdan keçibsə (Info.plist və ya Core Graphics vasitəsilə), onun deskriptoru ailə və ya ad ilə sistem şiftləri kimi eyni şəkildə yaradılır. Uyğunlaşdırma bütün qeydiyyatdan keçmiş şiftlər üçün işləyir.

Deskriptordan şift adını necə əldə etmək olar?

Göstərilən adı əldə etmək üçün descriptor.object(forKey: .visibleName) və ya PostScript adı üçün descriptor.postscriptName istifadə edin. PostScript adı UIFont(name:size:) vasitəsilə şift yaradılarkən istifadə olunur.

Font Descriptor-da cascade list nədir?

Cascade list — ehtiyat şiftlər kimi xidmət edən iç-içə deskriptorlar massividir. Əsas şift tələb olunan simvolu ehtiva etməzsə, sistem cascade list-dən şiftləri ardıcıl olaraq yoxlayır. Emoji və CJK simvollarını dəstəkləmək üçün istifadə olunur.

Font Descriptor SwiftUI-də işləyirmi?

Bəli. SwiftUI Font Descriptor-u Font(descriptor:size:) vasitəsilə dəstəkləyir. SwiftUI örtüyücüsü UIFontDescriptor qəbul edir və deskriptorun bütün atributlarını — kerning, liqaturalar və üz şeklini qoruyaraq SwiftUI şifti yaradır.

Nəticə

  • Font Descriptor — ailə, üz şekli, ölçü və tipoqrafik xüsusiyyətlər atributları ilə şift təsviredici obyekti
  • Atributlar dəstindən avtomatik şift uyğunlaşdırması ilə UIFont yaratmağa imkan verir
  • addingAttributes, withSize, withSymbolicTraits vasitəsilə dəyişməz modifikasiyanı dəstəkləyir
  • matchingFontDescriptors şift axtarışı və seçimi üçün bütün mövcud üz şkillərini qaytarır
  • UIFontDescriptor və CTFontDescriptor arasında toll-free bridging vasitəsilə Core Text ilə inteqrasiya edir
  • Seçilən mətn stilləri və miqyaslama vasitəsilə Dynamic Type-i dəstəkləyir
  • Şift mövcudluğunu yoxlamadan bütün iOS versiyalarını dəstəkləyən adaptiv tipoqrafiya üçün tövsiyə olunur

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun