In iOS7 gibt es neue APIs zum Abrufen einer Schriftart, die automatisch an die Textgröße angepasst wird, die der Benutzer in seinen Einstellungen festgelegt hat.
Es sieht ungefähr so aus, um es zu benutzen:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Unabhängig davon, welchem Text Sie dies zuweisen, wird die Schriftgröße nach oben und unten verschoben, wenn der Benutzer die Einstellung der Systemtextgröße ändert. (Denken Sie daran, die zu hörenname:UIContentSizeCategoryDidChangeNotification
Benachrichtigung und Ihre Ansicht zu aktualisieren, um die Größenänderung zu berücksichtigen.)
Antworten:
Hinter den Kulissen dieser API verfügt Apple über eine Art Nachschlagetabelle, die eine bestimmte Schriftfamilie, Größe und manchmal symbolische Merkmale (wie Fettdruck) (z. B.
UIFontTextStyleHeadline
) und die vom Benutzer bevorzugte Textgröße zurückgibt. Letzteres ist eine Schnur, diesharedApplication
wie folgt abgezogen wurde :(Ich habe alle Standardgrößen / Schriftarten / Merkmale für Helvetica-Neue für die verschiedenen dynamischen Textgrößen abgemeldet .) Seitdem haben wir die Handhabung für die Barrierefreiheitsgrößen hinzugefügt, was wichtig ist .
Alles, was Sie wirklich tun müssen, ist eine ähnliche Nachschlagetabelle zu erstellen. Unser Designer hat für mich eine einfache Tabelle erstellt:
Beachten Sie, dass wir einige Stile hinzugefügt haben (Beschriftung 3 und 4), um 8 statt 6 zur Auswahl zu haben.
Dann möchten Sie es an einem geeigneten Ort platzieren, z. B. in einer Kategorie
UIFontDescriptor
. Sie möchten, dass Ihre Methode a zurückgibtUIFontDescriptor
ähnliche API wie Apple zurückgibt, damit die Anpassung mit symbolischen Merkmalen usw. noch einfach ist.Meine Kategorie sieht folgendermaßen aus:
UIFontDescriptor + AvenirNext.h
UIFontDescriptor + AvenirNext.m
Wir haben uns dafür entschieden, dieselbe Basisschriftart
AvenirNext-Medium
und dann Fettdruck und dergleichen über symbolische Merkmale zu verwenden, aber Sie könnten verrückt werden und verschiedene Gewichtsvarianten für Ihre Schriftart als Teil Ihrer Nachschlagetabelle angeben, wenn Sie möchtenAvenirNext-ExtraBold
.Das ist alles dazu! Wir benutzen es so:
quelle
UIContentSizeCategoryAccessibilityMedium
,UIContentSizeCategoryAccessibilityLarge
etc.UIFont
, damit Sie einfach verwenden können :[UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]
? Größe ist in dem Beispiel, das Sie unten geben, redundant?So mache ich das in Swift. Ich mag das, weil es allgemeiner ist, nur eine Tabelle benötigt und mit jeder Schriftart gut funktionieren sollte. Zuerst habe ich einen verallgemeinerten Multiplikator geschrieben (in einem Getter).
Dann aktualisiere ich die Schriftart (z. B. im Beobachter)
UIFontDescriptor
wie folgt:quelle
In iOS 11 wurde die
UIFontMetrics
Klasse eingeführt. Erstellen Sie ein FontMetrics-Objekt für den gewünschten Textstil. Wählen Sie dann eine beliebige Schriftart aus, deren Größe der standardmäßigen dynamischen Schriftgröße entspricht. Anschließend können Sie das FontMetrics-Objekt bitten, diese Schriftart unter Berücksichtigung der aktuellen Einstellungen des Benutzers zu skalieren.quelle
@ Bob Spryn Code schnell umgeschrieben:
Verwendung:
quelle
let style = Static.fontSizeTable[textStyle] as! NSDictionary
undreturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
Versuche dies:
Beachten Sie jedoch, dass dieser Code nur eine Annäherung ist (Dynamic Type kann viel mehr als nur die Schriftgröße skalieren).
quelle
Ähnlich wie bei @ bill-weinman habe ich die Waage genommen und in eine Funktion aufgeteilt, die nicht auf einer bestimmten Schriftgröße von 16 basiert .
Es kann dann mit benutzerdefinierten Schriftarten wie diesen verwendet werden:
quelle
In iOS 11 können Sie Folgendes verwenden:
Siehe auch Erstellen von Apps mit dynamischem Typ WWDC 2017 - Sitzung 245 - iOS- Zeit 8:34.
quelle
Schneller 2.1-3.0-Code basierend auf @ smartDonkeys Port von @ Bob Spryn-Code. Auch mit den Apple-Größen von @Klaas aktualisiert .
quelle
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
So aktualisiere ich die Schriftart eines bevorzugten FontForTextStyle:
quelle
Ich wollte nur hineinspringen und sagen, dass es eine Bibliothek gibt, die dabei hilft, benutzerdefinierte Schriftarten zu integrieren und die Größenänderungen des dynamischen Typs zu bewältigen. Es heißt hilfreich Font ( https://github.com/adamyanalunas/Font ) und statt einer magischen Lösung wird eine Struktur eingerichtet, mit der jede benutzerdefinierte Schriftart beim Entfernen der Boilerplate unterschiedlich behandelt werden kann.
nb Ich bin der Autor dieser kleinen Bibliothek und ich denke, es ist ordentlich.
quelle
Hier ist meine Sicht auf die Antwort von @ Gobe in Swift 3:
quelle
Ab iOS 11 können Sie benutzerdefinierte Schriftarten, die im visuellen Editor konfiguriert wurden, programmgesteuert anpassen:
quelle