UIFont / CTFont — bu nədir, şrift növləri və Core Text

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

UIFontCTFont — iOS-da şriftlərlə işləmək üçün siniflərdir: UILabel və UITextView-də mətnin yüksək səviyyəli konfiqurasiyası üçün UIKit-dən UIFont, gliflər və metrikalar üzərində tam nəzarətlə aşağı səviyyəli renderinq üçün Core Text-dən CTFont. Apple Developer Documentation-ya görə, UIFont standart UI komponentlərinin 90%-də istifadə olunur, CTFont isə xüsusi mətn mühərriklərində və redaktorlarda tətbiq edilir. Hər iki sinif eyni şrifti, lakin fərqli abstraksiya səviyyəsində təmsil edir.

Əsas məqamlar

  • UIFont — UI komponentlərində şriftlərlə işləmək üçün yüksək səviyyəli UIKit sinfi
  • CTFont — tipoqrafiya üzərində dəqiq nəzarət üçün aşağı səviyyəli Core Text sinfi
  • UIFont systemFont, preferredFont və ya initWithName vasitəsilə, CTFont isə CTFontCreateWithName vasitəsilə yaradılır
  • Dynamic Type — əlçatanlıq parametrlərinə avtomatik reaksiya verən iOS adaptiv şrift sistemi
  • CTFont glif metrikalarına, kerningə və OpenType cədvəllərinə birbaşa giriş təmin edir

UIFont və CTFont nədir?

UIFont — UI komponentlərində mətn göstərmək üçün şrifti təmsil edən UIKit sinfi: UILabel, UITextView, UITextField. O, ölçü, çəki və stil göstərməklə sistem və xüsusi şriftləri əldə etmək üçün sadə interfeys təmin edir. UIFont kerning, liqatura və OpenType xüsusiyyətlərini birbaşa idarə etməyə imkan vermir — bunun üçün Core Text istifadə olunur.

CTFont — şrift məlumatlarına aşağı səviyyəli giriş təmin edən Core Text növüdür (CTFontRef). CTFont birbaşa Core Graphics ilə işləyərək renderinq üçün, alternativ gliflər, liqaturalar və dəyişən şriftlər daxil olmaqla bütün OpenType və TrueType imkanlarını dəstəkləyir. CTFont UIFont-un göstərilməsi üçün UIKit daxilində istifadə olunur, həm də xüsusi çəkmə üçün birbaşa əlçatandır.

Toll-Free Bridging

UIFont və CTFont toll-free bridging — əlavə xərc olmadan növlər arasında çevrilməni dəstəkləyir. Swift və Objective-C-də UIFont as CTFont və ya CTFont as UIFont kastinqi mümkündür. Bu, konfiqurasiya üçün yüksək səviyyəli UIKit API və renderinq üçün aşağı səviyyəli Core Text-dən şrift məlumatlarını kopyalamadan istifadə etməyə imkan verir.

Font Descriptor

Hər iki sinif şrift xüsusiyyətlərini təsvir etmək üçün UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) istifadə edir: ad, ölçü, çəki, stil, transformasiya matrisi. Descriptor dəyişdirilə bilən və mövcud şriftlər əsasında yeni şriftlər yaratmağa imkan verən atributlar lüğətidir. Məsələn, deskriptora traitItalic əlavə edib eyni şriftin kursiv versiyasını əldə etmək.

UIFont — UIKit şriftləri

UIFont şriftlər yaratmaq üçün bir neçə fabrik metodu təqdim edir. systemFont(ofSize:) sistem şriftini qaytarır San Francisco (iOS) və ya Helvetica (köhnə versiyalar). boldSystemFont, italicSystemFont — krojlu variantlar. preferredFont(forTextStyle:) verilmiş stil üçün Dynamic Type şriftini qaytarır: .headline, .body, .caption1, .footnote. Bu şriftlər sistemdə mətn ölçüsü parametrləri dəyişdikdə avtomatik miqyaslanır.

Xüsusi şriftləri yükləmək üçün şriftin PostScript adı ilə UIFont(name:size:) istifadə olunur. Şrift əvvəlcədən Info.plist-ə əlavə edilməli və tətbiq bundle-na daxil edilməlidir. Apple-ın məlumatına görə, bütün standart UI komponentləri üçün UIFont-dan istifadə etmək və yalnız xüsusi renderinq zəruri olduqda CTFont-a keçmək tövsiyə olunur.

Dynamic Type

Dynamic Type — iOS 7-də təqdim edilmiş adaptiv şriftlər sistemi. İstifadəçi Parametrlərdə üstünlük verdiyi mətn ölçüsünü seçir — çox kiçikdən çox böyükə qədər. UIFont.preferredFont avtomatik olaraq müvafiq ölçüdə şrifti qaytarır. Düzgün işləməsi üçün bütün UILabel-lərdə adjustsFontForContentSizeCategory = true olmalıdır. Dynamic Type əlçatanlıq uyğunluğu üçün məcburidir.

UIFontDescriptor

UIFontDescriptor sıfırdan yeni nümunə yaratmadan şrift atributlarını dəyişdirməyə imkan verir. addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) metodları dəyişdirilmiş parametrlərlə yeni deskriptor qaytarır. Bu, şrift variantlarını əldə etmək üçün əlverişlidir: sistem şriftinə traitBold əlavə edib PostScript adını bilmədən qalın versiyanı əldə etmək.

CTFont — Core Text şriftləri

CTFont (CTFontRef) — şriftlərlə aşağı səviyyəli iş üçün Core Text növüdür. CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes funksiyaları ilə yaradılır. Hər bir funksiya müəyyən interfeys, ölçü və isteğe bağlı atributlarla şrift qaytarır. CTFont Core Graphics-də xüsusi UIView-lərdə drawRect vasitəsilə mətn renderinqi üçün istifadə olunur.

CTFont UIFont-da mövcud olmayan metrikalara giriş təmin edir: CTFontGetGlyphsForCharacters verilmiş simvollar üçün glif massivi qaytarır, CTFontGetAdvancesForGlyphs — hər glifin enini, CTFontGetBoundingBox — glifin sərhədlərini qaytarır. Bu, xüsusi mətn layoutları qurmaq üçün lazımdır: sütunlar, fırlanma, axın.

Şrift metrikaları

CTFontGetAscent, CTFontGetDescent, CTFontGetLeading şriftin şaquli metrikalarını qaytarır. CTFontGetUnitsPerEm — em-square üzrə vahidlərin sayı, nisbətlərin hesablanması üçün istifadə olunur. CTFontGetGlyphCount — şriftdəki gliflərin ümumi sayı. Bu məlumatlar çap tipoqrafiyası və hər simvolun dəqiq yerləşdirilməsi tələb olunan xüsusi düzənlər üçün kritik əhəmiyyətlidir.

OpenType və dəyişən şriftlər

CTFont OpenType xüsusiyyətlərini dəstəkləyir: CTFontCopyFeatures şriftin mövcud funksiyalarının lüğətini qaytarır (liqaturalar, alternativ simvollar, kerning), CTFontEnableFeature konkret seçimi aktivləşdirir. Dəyişən şriftlər (Variable Fonts) CTFontCopyVariation və CTFontCreateCopyWithVariation vasitəsilə konfiqurasiya edilir, weight, width və slant-ı davamlı diapazonda dəyişməyə imkan verir.

Koddə UIFont-dan necə istifadə etməli

Swift-də UIFont yaratmaq fabrik metodlarından biri və ya birbaşa adla inisializasiya vasitəsilə həyata keçirilir. Ən geniş yayılmış üsul sistem şriftləri üçün systemFont(ofSize:weight:) və ya Dynamic Type üçün preferredFont(forTextStyle:)-dir. Xüsusi şriftlər üçün PostScript adı göstərilməklə UIFont(name:size:) istifadə olunur.

Müxtəlif çəkilərlə sistem şrifti

UIFont.systemFont(ofSize:weight:) UIFont.Weight qəbul edir — .ultraLight-dan .black-ə qədər. Bu metod müvafiq çəki ilə San Francisco sistem şriftini qaytarır. UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont kod və rəqəmlər üçün monospace şriftləri qaytarır. Bütün sistem şriftləri avtomatik olaraq Dynamic Type-ı dəstəkləyir.

swift
let regularFont = UIFont.systemFont(ofSize: 16, weight: .regular)
let boldFont = UIFont.systemFont(ofSize: 16, weight: .bold)
let headlineFont = UIFont.preferredFont(forTextStyle: .headline)
let monoFont = UIFont.monospacedSystemFont(ofSize: 14, weight: .regular)
label.font = headlineFont

Hər bir şrift birbaşa UILabel-in font xüsusiyyətinə təyin edilə və ya NSFontAttributeName vasitəsilə NSAttributedString-də istifadə oluna bilər. Sistem şriftləri iOS tərəfindən keşlənir, buna görə sistem şriftinin təkrar yaradılması əlavə xərc çəkmir.

Bundle-dan xüsusi şrift

Xüsusi şriftdən istifadə etmək üçün TTF və ya OTF faylını layihə bundle-na əlavə edin və onu Info.plist-də (UIAppFonts) qeyd edin. Şriftin PostScript adını UIFont.familyNames və UIFont.fontNames(forFamilyName:) vasitəsilə öyrənmək olar. Qeydiyyatdan sonra şrift tətbiqin istənilən yerində UIFont(name:size:) vasitəsilə əlçatan olur.

swift
// Bütün şrift ailə adlarını əldə edin
for family in UIFont.familyNames {
    let names = UIFont.fontNames(forFamilyName: family)
    print("\(ailə): \(adlar)")
}
// Xüsusi şrifti yükləyin
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
    label.font = customFont
}

Şrift adı səhv göstərilibsə, UIFont(name:size:) nil qaytarır. Şriftin düzgün qeydiyyatdan keçdiyinə əmin olmaq üçün debug zamanı UIFont.familyNames və UIFont.fontNames(forFamilyName:) vasitəsilə bütün mövcud adları çap etmək tövsiyə olunur.

UIFont və CTFont ilə xüsusi şriftlər

Xüsusi şriftlərin yüklənməsi iki yolla mümkündür: Info.plist (UIAppFonts) vasitəsilə statik qeydiyyat və CTFontManagerRegisterGraphicsFont vasitəsilə dinamik qeydiyyat. Birinci üsul daha sadədir — şrift tətbiq işə salındıqdan dərhal sonra əlçatandır. İkincisi, şəbəkədən yüklənən və ya tələb əsasında endirilən şriftlər üçün istifadə olunur.

Dinamik qeydiyyat tələb əsaslı resurslar üçün faydalıdır: əgər tətbiqdə 20+ şrift varsa, onların hamısı ilkin bundle-a daxil edilməməli, ilk istifadə zamanı endirilə bilər. CTFontManagerRegisterFontsForURLs göstərilən URL-lərdən şriftləri qeydiyyatdan keçirir. Qeydiyyatdan sonra şrift həmişəki kimi UIFont(name:size:) vasitəsilə əlçatan olur.

Xüsusi şrift üçün CTFontCreateWithName

Core Text vasitəsilə xüsusi renderinq üçün şriftin PostScript adı ilə CTFontCreateWithName istifadə edin. UIFont-dan fərq ondadır ki, CTFont transformasiya matrisi ilə yaradıla bilər (CTFontCreateWithNameAndOptions) — əyri şriftlər yaratmaq üçün: əymək, X oxu üzrə miqyaslamaq, fırlatmaq. Bu, affin transformasiyalarından istifadə etmədən UIFont-da mövcud deyil.

swift
// CTFont-u əyilmə matrisi ilə yaradın
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
    "Helvetica" as CFString,
    24, &matrix)
// UIFont ilə toll-free bridging istifadə edin
let uiFont = ctFont as UIFont
label.font = uiFont

Transformasiya matrisi ayrıca şrift faylı olmadan italic variantlar yaratmağa imkan verir. c parametri (skew) simvollara əyilmə əlavə edir. Matris həmçinin şrifti üfüqi miqyaslamağa imkan verir — eyni şriftin sıxılmış və ya genişləndirilmiş variantlarını yaratmaq.

UIFont və CTFont arasındakı fərqlər

UIFontCTFont arasındakı əsas fərq abstraksiya səviyyəsidir. UIFont ümumi tapşırıqlar üçün sadə API təmin edir: sistem şriftini əldə etmək, ölçüsünü dəyişmək, UILabel-ə tətbiq etmək. CTFont şrift üzərində tam nəzarət verir: gliflərə, metrikalara, OpenType cədvəllərinə və dəyişən oxlara giriş. Seçim tapşırıqdan asılıdır.

XüsusiyyətUIFontCTFont
FrameworkUIKitCore Text
YaradılmasystemFont / preferredFont / initWithNameCTFontCreateWithName / CTFontCreateWithDescriptor
Gliflərə girişXeyrCTFontGetGlyphsForCharacters
OpenType xüsusiyyətləriMəhdud (UIFontDescriptor)Tam giriş
Dəyişən şriftlərUIFontDescriptor vasitəsiləCTFontCopyVariation / CreateCopyWithVariation
RenderinqUI komponentlərində avtomatikCore Graphics, xüsusi

iOS inkişafı tapşırıqlarının 95%-i üçün UIFont kifayətdir. CTFont ilə Core Text mətn redaktorları, PDF generatorları, tipoqrafik düzənli kitablar və ya nadir dillərin xüsusi göstərilməsi olan tətbiqlər yaratarkən əsaslandırılır.

Performans və best practices

iOS-da şriftlərlə iş performansın nəzərə alınmasını tələb edir. Hər unikal şrift ilk istifadə zamanı yaddaşa yüklənir və resurs tutur. San Francisco sistem şriftləri əvvəlcədən yüklənib və əlavə xərc yaratmır. Xüsusi şriftlər fayldan yüklənir və ilk yükləmədən sonra sistem tərəfindən keşlənir.

Tətbiqdə unikal şriftlərin sayını 3-5 ailə ilə məhdudlaşdırmaq tövsiyə olunur. Hər bir şrift yaddaşda 50 KB-dan 2 MB-a qədər yer tutur. Bir ailənin müxtəlif çəkilərindən (regular, bold, medium) istifadə etmək bir neçə fərqli ailəni yükləməkdən daha səmərəlidir.

UIFont keşləmə

Sistem yaradılmış UIFont nümunələrini keşləyir, buna görə UIFont.systemFont(ofSize: 16, weight: .regular) təkrar çağırışları yeni obyekt yaratmır. Lakin UIFont(name:size:) xüsusi şriftlər üçün həmişə keşlənmir — fayldan təkrar yükləmənin qarşısını almaq üçün tez-tez istifadə olunan şriftləri statik xüsusiyyətlərdə və ya NSCache keşində saxlamaq tövsiyə olunur.

Şriftlərin asinxron yüklənməsi

CTFontManagerRegisterGraphicsFont vasitəsilə dinamik qeydiyyat zamanı proses asinxron ola bilər, əgər şrift faylı şəbəkədən endirilirsə. Bu halda UILabel və ya UITextView yüklənmə tamamlanana qədər ehtiyat sistem şriftini göstərməlidir. Qeydiyyatdan sonra şrift əlçatan olur və ekran avtomatik olaraq mətn göstərilməsini yeniləyir.

Tez-tez verilən suallar

UIFont-u CTFont-a və əksinə çevirmək mümkündürmü?

Bəli, UIFont və CTFont toll-free bridging-i dəstəkləyir. Çevrilmə sadə kastinqlə həyata keçirilir: UIFont as CTFont və ya CTFont as UIFont. Heç bir əlavə xərc və ya məlumatların kopyalanması baş vermir — hər iki sinif yaddaşda eyni şrift obyektinə işarə edir.

UIKit-də istifadə üçün hansı daha üstündür?

Bütün UI komponentləri üçün UIFont istifadə edin. O, UIKit üçün optimallaşdırılıb, Dynamic Type-ı dəstəkləyir, sistem parametrləri dəyişdikdə düzgün miqyaslanır. CTFont yalnız Core Graphics vasitəsilə xüsusi renderinq və ya şriftin aşağı səviyyəli metrikalarına giriş lazım olduqda əsaslandırılır.

UIFont(name:size:) üçün şrift adını necə tapmaq olar?

Ailələrin siyahısı üçün UIFont.familyNames və PostScript adları üçün UIFont.fontNames(forFamilyName:) istifadə edin. Bu kodu debug rejimində çağırın və lazımi şrifti tapın. PostScript adı adətən ailənin adını və krojunu ehtiva edir: “SFProText-Regular”, “HelveticaNeue-Bold”.

UIFont dəyişən şriftləri dəstəkləyirmi?

Bəli, UIFontDescriptor vasitəsilə dəyişən oxları konfiqurasiya etmək olar: weight, width, slant. Lakin UIFont-un dəyişən şriftlər üçün API-i CTFontCopyVariation ilə müqayisədə məhduddur. Dəyişən oxlar üzərində tam nəzarət üçün Core Text və CTFontCreateCopyWithVariation istifadə edin.

UIFont-u necə düzgün keşləmək olar?

Ad və ölçü kombinasiyasından açar ilə statik lüğət və ya NSCache yaradın. Sistem şriftləri üçün iOS nümunələri avtomatik keşləyir, lakin UIFont(name:size:) vasitəsilə yaradılmış xüsusi şriftlər üçün obyektləri tətbiq keşində saxlamaq tövsiyə olunur ki, TTF faylından təkrar yükləmənin qarşısı alınsın.

Nəticə

  • UIFont — Dynamic Type ilə UI komponentlərində şriftlər üçün yüksək səviyyəli UIKit sinfi
  • CTFont — renderinq və gliflərə giriş üçün aşağı səviyyəli Core Text növü
  • UIFont systemFont, preferredFont və ya UIFont(name:size:) vasitəsilə yaradılır
  • CTFont CTFontCreateWithName və ya CTFontCreateWithDescriptor vasitəsilə yaradılır
  • Toll-free bridging UIFont-u CTFont-a və əksinə pulsuz çevirməyə imkan verir
  • Dynamic Type əlçatanlıq üçün məcburidir: preferredFont və adjustsFontForContentSizeCategory istifadə edin
  • UIKit üçün UIFont, xüsusi renderinq üçün CTFont istifadə edin

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