W iOS7 dostępne są nowe API do pobierania czcionki, która jest automatycznie dostosowywana do rozmiaru tekstu ustawionego przez użytkownika w swoich preferencjach.
Wygląda to mniej więcej tak:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Teraz dowolny tekst, do którego to przypiszesz, będzie przesuwał się w górę iw dół w rozmiarze czcionki, gdy użytkownik zmieni swoje systemowe ustawienie rozmiaru tekstu. (Pamiętaj, aby odsłuchać name:UIContentSizeCategoryDidChangeNotification
powiadomienie i zaktualizować widok, aby uwzględnić zmianę rozmiaru).
Odpowiedzi:
Za kulisami tego API Apple ma jakąś tabelę odnośników, która zwraca określoną rodzinę czcionek, rozmiar, a czasem cechy symboliczne (takie jak pogrubienie) (np.
UIFontTextStyleHeadline
) I preferowany rozmiar tekstu użytkownika. Ten ostatni to sznurek ściągnięty zsharedApplication
takiego:[UIApplication sharedApplication].preferredContentSizeCategory;
(Wylogowałem wszystkie domyślne rozmiary / czcionki / cechy dla Helvetica-Neue dla różnych dynamicznych rozmiarów tekstu). Od tego czasu dodaliśmy obsługę rozmiarów ułatwień dostępu, co jest ważne .
Więc wszystko, co naprawdę musisz zrobić, to zbudować podobną tabelę przeglądową. Nasz projektant stworzył dla mnie prosty arkusz kalkulacyjny:
Zauważ, że dodaliśmy kilka stylów (podpis 3 i 4), aby mieć 8 zamiast 6 do wyboru.
Następnie będziesz chciał umieścić to w dogodnym miejscu, na przykład w kategorii
UIFontDescriptor
. Będziesz chciał, aby Twoja metoda zwróciłaUIFontDescriptor
podobny interfejs API firmy Apple, aby nadal można było łatwo dostosować ją za pomocą cech symbolicznych itp.Moja kategoria wygląda następująco:
UIFontDescriptor + AvenirNext.h
#import <UIKit/UIKit.h> extern NSString *const ANUIFontTextStyleCaption3; @interface UIFontDescriptor (AvenirNext) +(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style; @end
UIFontDescriptor + AvenirNext.m
#import "UIFontDescriptor+AvenirNext.h" NSString *const ANUIFontTextStyleCaption3 = @"ANUIFontTextStyleCaption3"; NSString *const ANUIFontTextStyleCaption4 = @"ANUIFontTextStyleCaption4"; @implementation UIFontDescriptor (AvenirNext) +(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style { static dispatch_once_t onceToken; static NSDictionary *fontSizeTable; dispatch_once(&onceToken, ^{ fontSizeTable = @{ UIFontTextStyleHeadline: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @26, UIContentSizeCategoryAccessibilityExtraExtraLarge: @25, UIContentSizeCategoryAccessibilityExtraLarge: @24, UIContentSizeCategoryAccessibilityLarge: @24, UIContentSizeCategoryAccessibilityMedium: @23, UIContentSizeCategoryExtraExtraExtraLarge: @23, UIContentSizeCategoryExtraExtraLarge: @22, UIContentSizeCategoryExtraLarge: @21, UIContentSizeCategoryLarge: @20, UIContentSizeCategoryMedium: @19, UIContentSizeCategorySmall: @18, UIContentSizeCategoryExtraSmall: @17,}, UIFontTextStyleSubheadline: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @24, UIContentSizeCategoryAccessibilityExtraExtraLarge: @23, UIContentSizeCategoryAccessibilityExtraLarge: @22, UIContentSizeCategoryAccessibilityLarge: @22, UIContentSizeCategoryAccessibilityMedium: @21, UIContentSizeCategoryExtraExtraExtraLarge: @21, UIContentSizeCategoryExtraExtraLarge: @20, UIContentSizeCategoryExtraLarge: @19, UIContentSizeCategoryLarge: @18, UIContentSizeCategoryMedium: @17, UIContentSizeCategorySmall: @16, UIContentSizeCategoryExtraSmall: @15,}, UIFontTextStyleBody: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @21, UIContentSizeCategoryAccessibilityExtraExtraLarge: @20, UIContentSizeCategoryAccessibilityExtraLarge: @19, UIContentSizeCategoryAccessibilityLarge: @19, UIContentSizeCategoryAccessibilityMedium: @18, UIContentSizeCategoryExtraExtraExtraLarge: @18, UIContentSizeCategoryExtraExtraLarge: @17, UIContentSizeCategoryExtraLarge: @16, UIContentSizeCategoryLarge: @15, UIContentSizeCategoryMedium: @14, UIContentSizeCategorySmall: @13, UIContentSizeCategoryExtraSmall: @12,}, UIFontTextStyleCaption1: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @19, UIContentSizeCategoryAccessibilityExtraExtraLarge: @18, UIContentSizeCategoryAccessibilityExtraLarge: @17, UIContentSizeCategoryAccessibilityLarge: @17, UIContentSizeCategoryAccessibilityMedium: @16, UIContentSizeCategoryExtraExtraExtraLarge: @16, UIContentSizeCategoryExtraExtraLarge: @16, UIContentSizeCategoryExtraLarge: @15, UIContentSizeCategoryLarge: @14, UIContentSizeCategoryMedium: @13, UIContentSizeCategorySmall: @12, UIContentSizeCategoryExtraSmall: @12,}, UIFontTextStyleCaption2: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @18, UIContentSizeCategoryAccessibilityExtraExtraLarge: @17, UIContentSizeCategoryAccessibilityExtraLarge: @16, UIContentSizeCategoryAccessibilityLarge: @16, UIContentSizeCategoryAccessibilityMedium: @15, UIContentSizeCategoryExtraExtraExtraLarge: @15, UIContentSizeCategoryExtraExtraLarge: @14, UIContentSizeCategoryExtraLarge: @14, UIContentSizeCategoryLarge: @13, UIContentSizeCategoryMedium: @12, UIContentSizeCategorySmall: @12, UIContentSizeCategoryExtraSmall: @11,}, ANUIFontTextStyleCaption3: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @17, UIContentSizeCategoryAccessibilityExtraExtraLarge: @16, UIContentSizeCategoryAccessibilityExtraLarge: @15, UIContentSizeCategoryAccessibilityLarge: @15, UIContentSizeCategoryAccessibilityMedium: @14, UIContentSizeCategoryExtraExtraExtraLarge: @14, UIContentSizeCategoryExtraExtraLarge: @13, UIContentSizeCategoryExtraLarge: @12, UIContentSizeCategoryLarge: @12, UIContentSizeCategoryMedium: @12, UIContentSizeCategorySmall: @11, UIContentSizeCategoryExtraSmall: @10,}, UIFontTextStyleFootnote: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @16, UIContentSizeCategoryAccessibilityExtraExtraLarge: @15, UIContentSizeCategoryAccessibilityExtraLarge: @14, UIContentSizeCategoryAccessibilityLarge: @14, UIContentSizeCategoryAccessibilityMedium: @13, UIContentSizeCategoryExtraExtraExtraLarge: @13, UIContentSizeCategoryExtraExtraLarge: @12, UIContentSizeCategoryExtraLarge: @12, UIContentSizeCategoryLarge: @11, UIContentSizeCategoryMedium: @11, UIContentSizeCategorySmall: @10, UIContentSizeCategoryExtraSmall: @10,}, ANUIFontTextStyleCaption4: @{ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: @15, UIContentSizeCategoryAccessibilityExtraExtraLarge: @14, UIContentSizeCategoryAccessibilityExtraLarge: @13, UIContentSizeCategoryAccessibilityLarge: @13, UIContentSizeCategoryAccessibilityMedium: @12, UIContentSizeCategoryExtraExtraExtraLarge: @12, UIContentSizeCategoryExtraExtraLarge: @11, UIContentSizeCategoryExtraLarge: @11, UIContentSizeCategoryLarge: @10, UIContentSizeCategoryMedium: @10, UIContentSizeCategorySmall: @9, UIContentSizeCategoryExtraSmall: @9,}, }; }); NSString *contentSize = [UIApplication sharedApplication].preferredContentSizeCategory; return [UIFontDescriptor fontDescriptorWithName:[self preferredFontName] size:((NSNumber *)fontSizeTable[style][contentSize]).floatValue]; } +(UIFontDescriptor *)preferredAvenirNextDemiBoldFontDescriptorWithTextStyle:(NSString *)style { return [[self preferredAvenirNextFontDescriptorWithTextStyle:style] fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; } +(UIFontDescriptor *)preferredAvenirNextBoldFontDescriptorWithTextStyle:(NSString *)style { return [UIFontDescriptor fontDescriptorWithName:[self preferredBoldFontName] size:[self preferredAvenirNextFontDescriptorWithTextStyle:style].pointSize]; } +(NSString *)preferredFontName { return @"AvenirNext-Medium"; } +(NSString *)preferredBoldFontName { return @"AvenirNext-Bold"; } @end
Zdecydowaliśmy się użyć tej samej czcionki podstawowej
AvenirNext-Medium
, a następnie pogrubienia i tak dalej za pomocą cech symbolicznych, ale możesz oszaleć i określić różne warianty grubości czcionki jako część tabeli wyszukiwania, jeśli chcesz, na przykładAvenirNext-ExtraBold
.To wszystko! Używamy tego w ten sposób:
[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]
źródło
UIContentSizeCategoryAccessibilityMedium
,UIContentSizeCategoryAccessibilityLarge
itpUIFont
, abyś mógł po prostu użyć[UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]
:? Rozmiar jest zbędny w przykładzie podanym na dole?Tak to robię w Swift. Podoba mi się to, ponieważ jest bardziej ogólne, wymaga tylko jednej tabeli i powinno dobrze działać z każdą czcionką. Najpierw napisałem uogólniony mnożnik (w getterze).
var fontSizeMultiplier : CGFloat { get { switch UIApplication.sharedApplication().preferredContentSizeCategory { case UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: return 23 / 16 case UIContentSizeCategoryAccessibilityExtraExtraLarge: return 22 / 16 case UIContentSizeCategoryAccessibilityExtraLarge: return 21 / 16 case UIContentSizeCategoryAccessibilityLarge: return 20 / 16 case UIContentSizeCategoryAccessibilityMedium: return 19 / 16 case UIContentSizeCategoryExtraExtraExtraLarge: return 19 / 16 case UIContentSizeCategoryExtraExtraLarge: return 18 / 16 case UIContentSizeCategoryExtraLarge: return 17 / 16 case UIContentSizeCategoryLarge: return 1.0 case UIContentSizeCategoryMedium: return 15 / 16 case UIContentSizeCategorySmall: return 14 / 16 case UIContentSizeCategoryExtraSmall: return 13 / 16 default: return 1.0 } } }
Następnie aktualizuję czcionkę (np. W obserwatorze) używając
UIFontDescriptor
takiego:textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)
źródło
W
UIFontMetrics
klasie iOS 11 została wprowadzona. Utwórz obiekt FontMetrics dla stylu tekstu, który Cię interesuje. Następnie wybierz dowolną czcionkę, dopasowaną do standardowego rozmiaru czcionki dynamicznej. Następnie możesz poprosić obiekt FontMetrics o przeskalowanie tej czcionki, biorąc pod uwagę bieżące ustawienia użytkownika.let bodyMetrics = UIFontMetrics(forTextStyle: .body) let standardFont = ... // any font you want, for standard type size let font = bodyMetrics.scaledFont(for: standardFont)
źródło
Kod @Bob Spryn przepisany szybko:
import UIKit extension UIFontDescriptor { private struct SubStruct { static var preferredFontName: NSString = "OEMeodedPashutPro-Regular" } class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor { struct Static { static var onceToken : dispatch_once_t = 0 static var fontSizeTable : NSDictionary = NSDictionary() } dispatch_once(&Static.onceToken) { Static.fontSizeTable = [ UIFontTextStyleHeadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 26, UIContentSizeCategoryAccessibilityExtraExtraLarge: 25, UIContentSizeCategoryAccessibilityExtraLarge: 24, UIContentSizeCategoryAccessibilityLarge: 24, UIContentSizeCategoryAccessibilityMedium: 23, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 22, UIContentSizeCategoryExtraLarge: 21, UIContentSizeCategoryLarge: 20, UIContentSizeCategoryMedium: 19, UIContentSizeCategorySmall: 18, UIContentSizeCategoryExtraSmall: 17 ], UIFontTextStyleSubheadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 24, UIContentSizeCategoryAccessibilityExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraLarge: 22, UIContentSizeCategoryAccessibilityLarge: 22, UIContentSizeCategoryAccessibilityMedium: 21, UIContentSizeCategoryExtraExtraExtraLarge: 21, UIContentSizeCategoryExtraExtraLarge: 20, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 18, UIContentSizeCategoryMedium: 17, UIContentSizeCategorySmall: 16, UIContentSizeCategoryExtraSmall: 15 ], UIFontTextStyleBody: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraExtraLarge: 20, UIContentSizeCategoryAccessibilityExtraLarge: 19, UIContentSizeCategoryAccessibilityLarge: 19, UIContentSizeCategoryAccessibilityMedium: 18, UIContentSizeCategoryExtraExtraExtraLarge: 18, UIContentSizeCategoryExtraExtraLarge: 17, UIContentSizeCategoryExtraLarge: 16, UIContentSizeCategoryLarge: 15, UIContentSizeCategoryMedium: 14, UIContentSizeCategorySmall: 13, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleCaption1: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraLarge: 17, UIContentSizeCategoryAccessibilityLarge: 17, UIContentSizeCategoryAccessibilityMedium: 16, UIContentSizeCategoryExtraExtraExtraLarge: 16, UIContentSizeCategoryExtraExtraLarge: 16, UIContentSizeCategoryExtraLarge: 15, UIContentSizeCategoryLarge: 14, UIContentSizeCategoryMedium: 13, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleCaption2: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraLarge: 16, UIContentSizeCategoryAccessibilityLarge: 16, UIContentSizeCategoryAccessibilityMedium: 15, UIContentSizeCategoryExtraExtraExtraLarge: 15, UIContentSizeCategoryExtraExtraLarge: 14, UIContentSizeCategoryExtraLarge: 14, UIContentSizeCategoryLarge: 13, UIContentSizeCategoryMedium: 12, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleFootnote: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 16, UIContentSizeCategoryAccessibilityExtraExtraLarge: 15, UIContentSizeCategoryAccessibilityExtraLarge: 14, UIContentSizeCategoryAccessibilityLarge: 14, UIContentSizeCategoryAccessibilityMedium: 13, UIContentSizeCategoryExtraExtraExtraLarge: 13, UIContentSizeCategoryExtraExtraLarge: 12, UIContentSizeCategoryExtraLarge: 12, UIContentSizeCategoryLarge: 11, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 10, UIContentSizeCategoryExtraSmall: 10 ], ] } let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory let style = Static.fontSizeTable[textStyle] as NSDictionary return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as NSNumber).floatValue)) } }
Stosowanie:
UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)
źródło
let style = Static.fontSizeTable[textStyle] as! NSDictionary
ireturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
Spróbuj tego:
UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline]; CGFloat userHeadLineFontSize = [userHeadLineFont pointSize]; myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];
Pamiętaj jednak, że ten kod jest tylko przybliżeniem (typ dynamiczny robi znacznie więcej niż tylko skalowanie rozmiaru czcionki).
źródło
Podobnie jak w podejściu @ bill-weinman , wziąłem skalę i rozbiłem ją na funkcję, która nie opiera się na podanym rozmiarze czcionki 16.
/// The font scale for a given font size. /// /// - seealso: [Source](https://stackoverflow.com/a/33114525/3643020) /// /// - Parameter fontSize: The font size. /// - Returns: The font scale public func fontScale(for fontSize: CGFloat) -> CGFloat { switch UIApplication.shared.preferredContentSizeCategory { case UIContentSizeCategory.accessibilityExtraExtraExtraLarge: return (fontSize + 8) / fontSize case UIContentSizeCategory.accessibilityExtraExtraLarge: return (fontSize + 7) / fontSize case UIContentSizeCategory.accessibilityExtraLarge: return (fontSize + 6) / fontSize case UIContentSizeCategory.accessibilityLarge: return (fontSize + 5) / fontSize case UIContentSizeCategory.accessibilityMedium: return (fontSize + 4) / fontSize case UIContentSizeCategory.extraExtraExtraLarge: return (fontSize + 3) / fontSize case UIContentSizeCategory.extraExtraLarge: return (fontSize + 2) / fontSize case UIContentSizeCategory.extraLarge: return (fontSize + 1) / fontSize case UIContentSizeCategory.large: return 1.0 case UIContentSizeCategory.medium: return (fontSize - 1) / fontSize case UIContentSizeCategory.small: return (fontSize - 2) / fontSize case UIContentSizeCategory.extraSmall: return (fontSize - 3) / fontSize default: return 1.0 } }
Można go następnie używać z niestandardowymi czcionkami, takimi jak:
/// Light font of specified size. /// /// - Parameter size: Font size. /// - Returns: Light font of specified size. func lightFont(ofSize size: CGFloat) -> UIFont { let scaledSize = size * fontScale(for: size) return UIFont(name: "HelveticaNeueLTStd-Lt", size: scaledSize)! }
źródło
W iOS 11 możesz użyć:
var customFont = UIFont.systemFont(ofSize: 17.0) if #available(iOS 11.0, *) { customFont = UIFontMetrics.default.scaledFont(for: customFont) } // use customFont...
Zobacz także Tworzenie aplikacji z typem dynamicznym WWDC 2017 - sesja 245 - czas iOS 8:34.
źródło
Kod Swift 2.1-3.0 oparty na porcie @ smartDonkey z kodem @Bob Spryn. Zaktualizowany również o rozmiary Apple z @Klaas .
import UIKit extension UIFontDescriptor { private struct SubStruct { static var preferredFontName: String = "Roboto-Light" } class func preferredDescriptor(textStyle: NSString) -> UIFontDescriptor { struct Static { static var onceToken : dispatch_once_t = 0 static var fontSizeTable : NSDictionary = NSDictionary() } dispatch_once(&Static.onceToken) { Static.fontSizeTable = [ UIFontTextStyleHeadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraExtraLarge: 23, UIContentSizeCategoryAccessibilityExtraLarge: 23, UIContentSizeCategoryAccessibilityLarge: 23, UIContentSizeCategoryAccessibilityMedium: 23, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 21, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 17, UIContentSizeCategoryMedium: 16, UIContentSizeCategorySmall: 15, UIContentSizeCategoryExtraSmall: 14 ], UIFontTextStyleSubheadline: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraExtraLarge: 21, UIContentSizeCategoryAccessibilityExtraLarge: 21, UIContentSizeCategoryAccessibilityLarge: 21, UIContentSizeCategoryAccessibilityMedium: 21, UIContentSizeCategoryExtraExtraExtraLarge: 21, UIContentSizeCategoryExtraExtraLarge: 19, UIContentSizeCategoryExtraLarge: 17, UIContentSizeCategoryLarge: 15, UIContentSizeCategoryMedium: 14, UIContentSizeCategorySmall: 13, UIContentSizeCategoryExtraSmall: 12 ], UIFontTextStyleBody: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 53, UIContentSizeCategoryAccessibilityExtraExtraLarge: 47, UIContentSizeCategoryAccessibilityExtraLarge: 40, UIContentSizeCategoryAccessibilityLarge: 33, UIContentSizeCategoryAccessibilityMedium: 28, UIContentSizeCategoryExtraExtraExtraLarge: 23, UIContentSizeCategoryExtraExtraLarge: 21, UIContentSizeCategoryExtraLarge: 19, UIContentSizeCategoryLarge: 17, UIContentSizeCategoryMedium: 16, UIContentSizeCategorySmall: 15, UIContentSizeCategoryExtraSmall: 14 ], UIFontTextStyleCaption1: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraExtraLarge: 18, UIContentSizeCategoryAccessibilityExtraLarge: 18, UIContentSizeCategoryAccessibilityLarge: 18, UIContentSizeCategoryAccessibilityMedium: 18, UIContentSizeCategoryExtraExtraExtraLarge: 18, UIContentSizeCategoryExtraExtraLarge: 16, UIContentSizeCategoryExtraLarge: 14, UIContentSizeCategoryLarge: 12, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 11, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleCaption2: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraExtraLarge: 17, UIContentSizeCategoryAccessibilityExtraLarge: 17, UIContentSizeCategoryAccessibilityLarge: 17, UIContentSizeCategoryAccessibilityMedium: 17, UIContentSizeCategoryExtraExtraExtraLarge: 17, UIContentSizeCategoryExtraExtraLarge: 15, UIContentSizeCategoryExtraLarge: 13, UIContentSizeCategoryLarge: 11, UIContentSizeCategoryMedium: 11, UIContentSizeCategorySmall: 11, UIContentSizeCategoryExtraSmall: 11 ], UIFontTextStyleFootnote: [ UIContentSizeCategoryAccessibilityExtraExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraExtraLarge: 19, UIContentSizeCategoryAccessibilityExtraLarge: 19, UIContentSizeCategoryAccessibilityLarge: 19, UIContentSizeCategoryAccessibilityMedium: 19, UIContentSizeCategoryExtraExtraExtraLarge: 19, UIContentSizeCategoryExtraExtraLarge: 17, UIContentSizeCategoryExtraLarge: 15, UIContentSizeCategoryLarge: 13, UIContentSizeCategoryMedium: 12, UIContentSizeCategorySmall: 12, UIContentSizeCategoryExtraSmall: 12 ], ] } let contentSize = UIApplication.sharedApplication().preferredContentSizeCategory let style = Static.fontSizeTable[textStyle] as! NSDictionary return UIFontDescriptor(name: SubStruct.preferredFontName, size: CGFloat((style[contentSize] as! NSNumber).floatValue)) } }
źródło
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
Oto moje podejście do odpowiedzi @ Gobe w Swift 3:
extension UIFontDescriptor { @nonobjc static var fontSizeTable: [UIFontTextStyle : [UIContentSizeCategory : CGFloat]] = { return [ .headline: [ .accessibilityExtraExtraExtraLarge: 23, .accessibilityExtraExtraLarge: 23, .accessibilityExtraLarge: 23, .accessibilityLarge: 23, .accessibilityMedium: 23, .extraExtraExtraLarge: 23, .extraExtraLarge: 21, .extraLarge: 19, .large: 17, .medium: 16, .small: 15, .extraSmall: 14], .subheadline: [ .accessibilityExtraExtraExtraLarge: 21, .accessibilityExtraExtraLarge: 21, .accessibilityExtraLarge: 21, .accessibilityLarge: 21, .accessibilityMedium: 21, .extraExtraExtraLarge: 21, .extraExtraLarge: 19, .extraLarge: 17, .large: 15, .medium: 14, .small: 13, .extraSmall: 12], .body: [ .accessibilityExtraExtraExtraLarge: 53, .accessibilityExtraExtraLarge: 47, .accessibilityExtraLarge: 40, .accessibilityLarge: 33, .accessibilityMedium: 28, .extraExtraExtraLarge: 23, .extraExtraLarge: 21, .extraLarge: 19, .large: 17, .medium: 16, .small: 15, .extraSmall: 14], .caption1: [ .accessibilityExtraExtraExtraLarge: 18, .accessibilityExtraExtraLarge: 18, .accessibilityExtraLarge: 18, .accessibilityLarge: 18, .accessibilityMedium: 18, .extraExtraExtraLarge: 18, .extraExtraLarge: 16, .extraLarge: 14, .large: 12, .medium: 11, .small: 11, .extraSmall: 11], .caption2: [ .accessibilityExtraExtraExtraLarge: 17, .accessibilityExtraExtraLarge: 17, .accessibilityExtraLarge: 17, .accessibilityLarge: 17, .accessibilityMedium: 17, .extraExtraExtraLarge: 17, .extraExtraLarge: 15, .extraLarge: 13, .large: 11, .medium: 11, .small: 11, .extraSmall: 11], .footnote: [ .accessibilityExtraExtraExtraLarge: 19, .accessibilityExtraExtraLarge: 19, .accessibilityExtraLarge: 19, .accessibilityLarge: 19, .accessibilityMedium: 19, .extraExtraExtraLarge: 19, .extraExtraLarge: 17, .extraLarge: 15, .large: 13, .medium: 12, .small: 12, .extraSmall: 12], ] }() class func currentPreferredSize(textStyle: UIFontTextStyle = .body) -> CGFloat { let contentSize = UIApplication.shared.preferredContentSizeCategory guard let style = fontSizeTable[textStyle], let fontSize = style[contentSize] else { return 17 } return fontSize } class func preferredFontDescriptor(fontName: String = "SnellRoundhand", textStyle: UIFontTextStyle = .body) -> UIFontDescriptor { return UIFontDescriptor(name: fontName, size: currentPreferredSize()) } }
źródło
W ten sposób aktualizuję czcionkę preferowanego styluFontForTextStyle:
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; UIFontDescriptor *fontDesc = [font fontDescriptor]; fontDesc = [fontDesc fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute : @"Helvetica", UIFontDescriptorSizeAttribute : @16}]; font = [UIFont fontWithDescriptor:fontDesc size:[fontDesc pointSize]];
źródło
Chciałem tylko wskoczyć i powiedzieć, że istnieje biblioteka, która pomoże zintegrować niestandardowe czcionki i poradzić sobie ze zmianami rozmiaru typu dynamicznego. Nazywa się, pomocnie, Font ( https://github.com/adamyanalunas/Font ) i zamiast być magicznym rozwiązaniem, tworzy strukturę do obsługi każdej niestandardowej czcionki w inny sposób podczas usuwania szablonu.
nb Jestem autorem tej lil 'biblioteki i myślę, że jest fajna.
źródło
Począwszy od iOS 11 możesz programowo dostosować niestandardowe czcionki skonfigurowane w edytorze wizualnym:
@IBOutlet weak var leftLangLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() leftLangLabel.font = UIFontMetrics.default.scaledFont(for: leftLangLabel.font) }
źródło