Di iOS7 ada API baru untuk mendapatkan font yang secara otomatis disesuaikan dengan ukuran teks yang telah diatur pengguna dalam preferensi mereka.
Ini terlihat seperti ini untuk menggunakannya:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Sekarang teks apa pun yang Anda tetapkan ini akan bergerak ke atas dan ke bawah dalam ukuran font saat pengguna mengubah pengaturan ukuran teks sistem mereka. (Ingatlah untuk mendengarkanname:UIContentSizeCategoryDidChangeNotification
pemberitahuan dan memperbarui pandangan Anda untuk memperhitungkan perubahan ukuran).
Jawaban:
Di balik layar API tersebut, apple memiliki semacam tabel pencarian yang mengembalikan jenis font tertentu, ukuran, dan terkadang sifat simbolik (seperti tebal) yang (misalnya
UIFontTextStyleHeadline
) dan ukuran teks pilihan pengguna. Yang terakhir adalah string yang ditariksharedApplication
seperti ini:[UIApplication sharedApplication].preferredContentSizeCategory;
(Saya keluar dari semua ukuran / font / sifat default untuk Helvetica-Neue untuk berbagai ukuran teks dinamis). Kami telah menambahkan penanganan untuk ukuran aksesibilitas, yang penting .
Jadi yang harus Anda lakukan adalah membuat tabel pencarian serupa. Desainer kami membuat spreadsheet sederhana untuk saya:
Perhatikan bahwa kami menambahkan beberapa gaya (judul 3 & 4) untuk memiliki 8, bukan 6 untuk dipilih.
Maka Anda pasti ingin meletakkannya di tempat yang nyaman, seperti kategori
UIFontDescriptor
. Anda ingin metode Anda mengembalikan fileUIFontDescriptor
API sejenis Apple, sehingga masih mudah untuk menyesuaikan dengan ciri-ciri simbolis, dll.Kategori saya terlihat seperti ini:
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
Kami memilih untuk menggunakan font dasar yang sama
AvenirNext-Medium
, lalu tebal dan semacamnya melalui ciri-ciri simbolis, tetapi Anda dapat menjadi gila dan menentukan varian bobot yang berbeda pada font Anda sebagai bagian dari tabel pencarian Anda juga jika Anda mau, sepertiAvenirNext-ExtraBold
.Hanya itu yang ada untuk itu! Kami menggunakannya seperti ini:
[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]
sumber
UIContentSizeCategoryAccessibilityMedium
,UIContentSizeCategoryAccessibilityLarge
, dllUIFont
, sehingga Anda bisa menggunakan[UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]
:? Ukuran berlebihan dalam contoh yang Anda berikan di bagian bawah?Ini adalah cara saya melakukannya di Swift. Saya suka ini karena ini lebih umum, hanya membutuhkan satu tabel, dan itu harus bekerja dengan baik dengan font apapun. Pertama saya menulis pengganda umum (dalam getter).
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 } } }
Kemudian saya memperbarui font (misalnya, di pengamat) menggunakan
UIFontDescriptor
seperti ini:textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)
sumber
Di
UIFontMetrics
kelas iOS 11 diperkenalkan. Buat objek FontMetrics untuk gaya teks yang Anda minati. Kemudian pilih font apa pun yang Anda inginkan, dengan ukuran untuk ukuran tipe dinamis standar. Dan kemudian Anda dapat meminta objek FontMetrics untuk menskalakan font tersebut berdasarkan pengaturan pengguna saat ini.let bodyMetrics = UIFontMetrics(forTextStyle: .body) let standardFont = ... // any font you want, for standard type size let font = bodyMetrics.scaledFont(for: standardFont)
sumber
Kode @Bob Spryn ditulis ulang dengan cepat:
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)) } }
Pemakaian:
UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)
sumber
let style = Static.fontSizeTable[textStyle] as! NSDictionary
danreturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
Coba ini:
UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline]; CGFloat userHeadLineFontSize = [userHeadLineFont pointSize]; myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];
Namun perlu diingat bahwa kode ini hanyalah perkiraan (Jenis Dinamis melakukan lebih dari sekadar ukuran font skala).
sumber
Mirip dengan pendekatan @ bill-weinman , saya mengambil timbangan, dan memecahnya menjadi fungsi yang tidak bergantung pada ukuran font 16 tertentu.
/// 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 } }
Ini kemudian dapat digunakan dengan font khusus seperti ini:
/// 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)! }
sumber
Di iOS 11 Anda dapat menggunakan:
var customFont = UIFont.systemFont(ofSize: 17.0) if #available(iOS 11.0, *) { customFont = UIFontMetrics.default.scaledFont(for: customFont) } // use customFont...
Lihat juga Membangun Aplikasi dengan Dynamic Type WWDC 2017 - Session 245 - iOS time 8:34.
sumber
Kode Swift 2.1-3.0 berdasarkan port @ smartDonkey dari kode @Bob Spryn. Juga diperbarui dengan ukuran Apple dari @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)) } }
sumber
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
Inilah pendapat saya atas jawaban @ Gobe, di 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()) } }
sumber
Beginilah cara saya memperbarui font dari sebuah prefferedFontForTextStyle:
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; UIFontDescriptor *fontDesc = [font fontDescriptor]; fontDesc = [fontDesc fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute : @"Helvetica", UIFontDescriptorSizeAttribute : @16}]; font = [UIFont fontWithDescriptor:fontDesc size:[fontDesc pointSize]];
sumber
Hanya ingin masuk dan mengatakan bahwa ada perpustakaan di luar sana untuk membantu mengintegrasikan font khusus dan menangani perubahan ukuran Jenis Dinamis. Ini disebut, sangat membantu, Font ( https://github.com/adamyanalunas/Font ) dan alih-alih menjadi solusi ajaib, ia mengatur struktur untuk menangani setiap font khusus secara berbeda saat menghapus boilerplate.
nb Saya penulis perpustakaan lil 'ini dan saya pikir itu rapi.
sumber
Mulai dari iOS 11 Anda dapat secara terprogram menyesuaikan font khusus yang dikonfigurasi di editor visual:
@IBOutlet weak var leftLangLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() leftLangLabel.font = UIFontMetrics.default.scaledFont(for: leftLangLabel.font) }
sumber