UIFont və CTFont — 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ə 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.
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.
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 ş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 — 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 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 (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.
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.
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.
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.
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.
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.
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.
// 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.
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.
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.
// 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ı ə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ət | UIFont | CTFont |
|---|---|---|
| Framework | UIKit | Core Text |
| Yaradılma | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| Gliflərə giriş | Xeyr | CTFontGetGlyphsForCharacters |
| OpenType xüsusiyyətləri | Məhdud (UIFontDescriptor) | Tam giriş |
| Dəyişən şriftlər | UIFontDescriptor vasitəsilə | CTFontCopyVariation / CreateCopyWithVariation |
| Renderinq | UI komponentlərində avtomatik | Core 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.
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.
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.
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
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.
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.
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”.
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.
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ə
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.
Həm də oxuyun