ios 如何在 iOS7 中使用具有动态文本大小的自定义字体
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20510094/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use a custom font with dynamic text sizes in iOS7
提问by Bob Spryn
In iOS7 there are new API's for getting a font that is automatically adjusted to the text size the user has set in their preferences.
在 iOS7 中,有新的 API 用于获取自动调整为用户在其首选项中设置的文本大小的字体。
It looks something like this to use it:
使用它看起来像这样:
UIFont *myFont = [UIFont fontWithDescriptor:[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size:0];
Now whatever text you assign this to will move up and down in font size as the user changes their system text size setting. (Remember to listen to the name:UIContentSizeCategoryDidChangeNotification
notification and update your view to account for the change in size).
现在,您将其分配给的任何文本都会随着用户更改其系统文本大小设置而上下移动字体大小。(请记住收听name:UIContentSizeCategoryDidChangeNotification
通知并更新您的视图以说明大小的变化)。
How do I use dynamic text with a font other than the default Helvetica-Neue?
如何将动态文本与默认 Helvetica-Neue 以外的字体一起使用?
回答by Bob Spryn
Behind the scenes of that API, apple has some sort of lookup table that returns a specific font family, size, and sometimes symbolic traits (like bold) that (e.g. UIFontTextStyleHeadline
) and the user's preferred text size. The latter is a string pulled off of the sharedApplication
like this:
在该 API 的幕后,Apple 有某种查找表,可以返回特定的字体系列、大小,有时还会返回符号特征(例如粗体)(例如UIFontTextStyleHeadline
)和用户首选的文本大小。后者是这样拉出的字符串sharedApplication
:
[UIApplication sharedApplication].preferredContentSizeCategory;
(I logged out all the default sizes/fonts/traits for Helvetica-Neuefor the various dynamic text sizes). We've since added handling for the accessibility sizes, which is important.
(我为各种动态文本大小注销了Helvetica-Neue 的所有默认大小/字体/特征)。我们已经添加了对可访问性大小的处理,这很重要。
So all you really have to do is build a similar lookup table. Our designer created a simple spreadsheet for me:
所以你真正需要做的就是建立一个类似的查找表。我们的设计师为我创建了一个简单的电子表格:
Notice that we added a couple styles (caption 3 & 4) to have 8 instead of 6 to choose from.
请注意,我们添加了几种样式(标题 3 和 4)以供选择 8 而不是 6。
Then you'll want to put it someplace convenient, like a category on UIFontDescriptor
. You'll want your method to return a UIFontDescriptor
like Apple's API, so that it's still easy to adjust with symbolic traits, etc.
然后你会想把它放在方便的地方,比如UIFontDescriptor
. 您会希望您的方法返回UIFontDescriptor
类似 Apple 的 API,以便使用符号特征等进行调整仍然很容易。
My category looks like this:
我的类别如下所示:
UIFontDescriptor+AvenirNext.h
UIFontDescriptor+AvenirNext.h
#import <UIKit/UIKit.h>
extern NSString *const ANUIFontTextStyleCaption3;
@interface UIFontDescriptor (AvenirNext)
+(UIFontDescriptor *)preferredAvenirNextFontDescriptorWithTextStyle:(NSString *)style;
@end
UIFontDescriptor+AvenirNext.m
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
We chose to use the same base font AvenirNext-Medium
, and then bold and such via symbolic traits, but you could get crazy and specify different weight variants on your font as part of your lookup table as well if you wanted, like AvenirNext-ExtraBold
.
我们选择使用相同的基本字体AvenirNext-Medium
,然后通过符号特征使用粗体等,但是如果您愿意,您可能会发疯并在字体上指定不同的粗细变体作为查找表的一部分,例如AvenirNext-ExtraBold
.
That's all there is to it! We use it like this:
这里的所有都是它的!我们像这样使用它:
[UIFont fontWithDescriptor:[UIFontDescriptor preferredAvenirNextFontDescriptorWithTextStyle:UIFontTextStyleHeadline] size: 0]
回答by Bill Weinman
This is how I do it in Swift. I like this because it's more general, it only requires one table, and it should work well with any font. First I wrote a generalized multiplier (in a getter).
这就是我在 Swift 中的做法。我喜欢这个因为它更通用,它只需要一张桌子,它应该适用于任何字体。首先,我写了一个广义乘法器(在 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
}
}
}
Then I update the font (e.g., in the observer) using a UIFontDescriptor
like this:
然后我使用这样的更新字体(例如,在观察者中)UIFontDescriptor
:
textView.font = UIFont(descriptor: fontDescriptor!, size: fontDescriptor!.pointSize * fontSizeMultiplier)
回答by sash
In iOS 11 UIFontMetrics
class was introduced. Create a FontMetrics object for the text style that you're interested in. Then choose any font you want, sized for the standard dynamic type size. And then you can ask the FontMetrics object to scale that font given the user's current settings.
在 iOS 11UIFontMetrics
中引入了类。为您感兴趣的文本样式创建一个 FontMetrics 对象。然后选择您想要的任何字体,大小为标准动态字体大小。然后您可以要求 FontMetrics 对象根据用户的当前设置缩放该字体。
let bodyMetrics = UIFontMetrics(forTextStyle: .body)
let standardFont = ... // any font you want, for standard type size
let font = bodyMetrics.scaledFont(for: standardFont)
回答by smartDonkey
@Bob Spryn code rewritten with swift:
用 swift 重写的@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))
}
}
Usage:
用法:
UIFont(descriptor: UIFontDescriptor.preferredDescriptor(UIFontTextStyleBody), size: 0)
回答by valfer
Try this:
尝试这个:
UIFontDescriptor *userHeadLineFont = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline];
CGFloat userHeadLineFontSize = [userHeadLineFont pointSize];
myFont = [UIFont fontWithName:@"Baskerville" size:userHeadLineFontSize];
But keep in mind that this code is only an approximation (Dynamic Type does much more than just scale font size).
但请记住,此代码只是一个近似值(动态类型不仅仅是缩放字体大小)。
回答by Campbell_Souped
Similar to @bill-weinman's approach, I took the scales, and broke it out into a function that doesn't rely on a given font size of 16.
与@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
}
}
It can then be used with custom fonts like this:
然后它可以与自定义字体一起使用,如下所示:
/// 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)!
}
回答by petrsyn
In iOS 11 you can use:
在 iOS 11 中,您可以使用:
var customFont = UIFont.systemFont(ofSize: 17.0)
if #available(iOS 11.0, *) {
customFont = UIFontMetrics.default.scaledFont(for: customFont)
}
// use customFont...
See also Building Apps with Dynamic Type WWDC 2017 - Session 245 - iOStime 8:34.
另请参阅使用动态类型构建应用程序WWDC 2017 - Session 245 - iOS时间 8:34。
回答by Gobe
Swift 2.1-3.0 code based on @smartDonkey's port of @Bob Spryn code. Also updated with the Apple sizes from @Klaas.
Swift 2.1-3.0 代码基于@smartDonkey 的@Bob Spryn 代码端口。还更新了来自@Klaas的 Apple 尺寸。
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))
}
}
回答by Joshua Kaden
Here is my take on @Gobe's answer, in Swift 3:
这是我在 Swift 3 中对@Gobe 的回答的看法:
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())
}
}
回答by Adam Yanalunas
Just wanted to jump in and say that there's a library out there to help integrate custom fonts and deal with the Dynamic Type size changes. It's called, helpfully, Font(https://github.com/adamyanalunas/Font) and instead of being a magic solution it sets up a structure for handling each custom font differently while removing the boilerplate.
只是想跳进去说有一个库可以帮助集成自定义字体并处理动态字体大小的变化。它被有用地称为Font( https://github.com/adamyanalunas/Font),它不是一个神奇的解决方案,而是设置了一个结构,用于在删除样板的同时以不同的方式处理每个自定义字体。
n.b. I'm the author of this lil' library and I think it's neat.
注意我是这个小图书馆的作者,我认为它很整洁。