В iOS7 есть новые API для получения шрифта, который автоматически подстраивается под размер текста, который пользователь установил в своих настройках.
Это выглядит примерно так:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Теперь любой текст, которому вы назначаете это, будет перемещаться вверх и вниз по размеру шрифта, когда пользователь изменяет свой системный размер текста. (Не забудьте прослушать name:UIContentSizeCategoryDidChangeNotification
уведомление и обновить свое представление, чтобы учесть изменение размера).
Ответы:
За кулисами этого API у Apple есть своего рода таблица поиска, которая возвращает конкретное семейство шрифтов, размер, а иногда и символические характеристики (например, жирный шрифт), которые (например
UIFontTextStyleHeadline
) и предпочитаемый пользователем размер текста. Последний представляет собой строку, вытянутую изsharedApplication
вот этого:[UIApplication sharedApplication].preferredContentSizeCategory;
(Я отключил все размеры / шрифты / свойства по умолчанию для Helvetica-Neue для различных размеров динамического текста). С тех пор мы добавили обработку для специальных размеров, что важно .
Итак, все, что вам действительно нужно сделать, это создать аналогичную таблицу поиска. Наш дизайнер создал для меня простую таблицу:
Обратите внимание, что мы добавили пару стилей (заголовки 3 и 4), чтобы на выбор было 8 вместо 6.
Тогда вы захотите поместить его в удобное место, например, в категорию
UIFontDescriptor
. Вы хотите, чтобы ваш метод возвращалUIFontDescriptor
API, похожий на API Apple, чтобы его все еще было легко настроить с помощью символических признаков и т. Д.Моя категория выглядит так:
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
Мы решили использовать один и тот же базовый шрифт
AvenirNext-Medium
, а затем полужирный и тому подобное с помощью символических признаков, но вы можете сходить с ума и указать разные варианты веса шрифта как часть вашей таблицы поиска, если хотите, напримерAvenirNext-ExtraBold
.Вот и все! Мы используем это так:
[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]
источник
UIContentSizeCategoryAccessibilityMedium
,UIContentSizeCategoryAccessibilityLarge
и т.д.UIFont
, чтобы можно было просто использовать[UIFont preferredAvenirFontForTextStyle:UIFontTextStyleHeadline]
:? Размер избыточен в примере, который вы даете внизу?Вот как я это делаю в Swift. Мне это нравится, потому что он более общий, для него требуется только одна таблица, и он должен хорошо работать с любым шрифтом. Сначала я написал обобщенный множитель (в геттере).
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 } } }
Затем я обновляю шрифт (например, в обозревателе)
UIFontDescriptor
следующим образом:textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)
источник
В iOS 11
UIFontMetrics
был введен класс. Создайте объект FontMetrics для интересующего вас стиля текста. Затем выберите любой нужный шрифт, размер которого соответствует стандартному размеру динамического типа. Затем вы можете попросить объект FontMetrics масштабировать этот шрифт с учетом текущих настроек пользователя.let bodyMetrics = UIFontMetrics(forTextStyle: .body) let standardFont = ... // any font you want, for standard type size let font = bodyMetrics.scaledFont(for: standardFont)
источник
Код @Bob Spryn переписан быстро:
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)) } }
Применение:
UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)
источник
let style = Static.fontSizeTable[textStyle] as! NSDictionary
иreturn UIFontDescriptor(name: SubStruct.preferredFontName as String, size: CGFloat((style[contentSize] as! NSNumber).floatValue))
Попробуй это:
UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline]; CGFloat userHeadLineFontSize = [userHeadLineFont pointSize]; myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];
Но имейте в виду, что этот код является лишь приблизительным (динамический тип делает гораздо больше, чем просто масштабирует размер шрифта).
источник
Подобно подходу @ bill-weinman , я взял шкалы и разбил их на функцию, которая не зависит от заданного размера шрифта 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 } }
Затем его можно использовать с настраиваемыми шрифтами, например:
/// 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)! }
источник
В iOS 11 вы можете использовать:
var customFont = UIFont.systemFont(ofSize: 17.0) if #available(iOS 11.0, *) { customFont = UIFontMetrics.default.scaledFont(for: customFont) } // use customFont...
См. Также Создание приложений с динамическим типом WWDC 2017 - сеанс 245 - время iOS 8:34.
источник
Код Swift 2.1–3.0 на основе порта @ smartDonkey кода @Bob Spryn. Также обновлены размеры Apple от @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)) } }
источник
'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals instead
Вот мой взгляд на ответ @Gobe в 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()) } }
источник
Вот как я обновляю шрифт prefferedFontForTextStyle:
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; UIFontDescriptor *fontDesc = [font fontDescriptor]; fontDesc = [fontDesc fontDescriptorByAddingAttributes:@{UIFontDescriptorNameAttribute : @"Helvetica", UIFontDescriptorSizeAttribute : @16}]; font = [UIFont fontWithDescriptor:fontDesc size:[fontDesc pointSize]];
источник
Просто хотел вмешаться и сказать, что существует библиотека, которая поможет интегрировать пользовательские шрифты и справиться с изменениями размера динамического типа. Он называется, кстати, Font ( https://github.com/adamyanalunas/Font ), и вместо того, чтобы быть волшебным решением, он устанавливает структуру для обработки каждого настраиваемого шрифта по-разному при удалении шаблона.
nb Я являюсь автором этой небольшой библиотеки, и я думаю, что это здорово.
источник
Начиная с iOS 11 вы можете программно настраивать пользовательские шрифты, настроенные в визуальном редакторе:
@IBOutlet weak var leftLangLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() leftLangLabel.font = UIFontMetrics.default.scaledFont(for: leftLangLabel.font) }
источник