From 9e2295b1449593a24daedff12e3984108b0aadbd Mon Sep 17 00:00:00 2001 From: Rahul Malik Date: Wed, 10 Jul 2019 10:19:52 -0700 Subject: [PATCH 1/4] Fallback to system font if the fontFamily is incorrect In iOS13, there is an issue with the font returned from "-[UIFontj fontWithName:size:]". When asking for "SFUI-Regular" returns "Times New Roman" font. It seems like a reasonable default would be to return the system font in the case that the requested font was not respected. --- Source/TextKit/ASTextKitCoreTextAdditions.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/TextKit/ASTextKitCoreTextAdditions.mm b/Source/TextKit/ASTextKitCoreTextAdditions.mm index e98b236c5..515b64484 100644 --- a/Source/TextKit/ASTextKitCoreTextAdditions.mm +++ b/Source/TextKit/ASTextKitCoreTextAdditions.mm @@ -73,8 +73,9 @@ BOOL ASAttributeWithNameIsUnsupportedCoreTextAttribute(NSString *attributeName) CGFloat fontSize = CTFontGetSize(coreTextFont); UIFont *font = [UIFont fontWithName:fontName size:fontSize]; ASDisplayNodeCAssertNotNil(font, @"unable to load font %@ with size %f", fontName, fontSize); - if (font == nil) { + if (font == nil || ![font.familyName isEqualToString:fontName]) { // Gracefully fail if we were unable to load the font. + // Additionally UIFont is returning a different font family than expected, fallback to the system font font = [UIFont systemFontOfSize:fontSize]; } cleanAttributes[NSFontAttributeName] = font; From ca5a16706cb5bc34148822e77b90c7bd5dd5ba0b Mon Sep 17 00:00:00 2001 From: Rahul Malik Date: Wed, 10 Jul 2019 14:42:11 -0700 Subject: [PATCH 2/4] Update fallback logic to respect the bold / italic specifications in CTFontSymbolicTraits --- Source/TextKit/ASTextKitCoreTextAdditions.mm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/TextKit/ASTextKitCoreTextAdditions.mm b/Source/TextKit/ASTextKitCoreTextAdditions.mm index 515b64484..47b92b64d 100644 --- a/Source/TextKit/ASTextKitCoreTextAdditions.mm +++ b/Source/TextKit/ASTextKitCoreTextAdditions.mm @@ -76,7 +76,14 @@ BOOL ASAttributeWithNameIsUnsupportedCoreTextAttribute(NSString *attributeName) if (font == nil || ![font.familyName isEqualToString:fontName]) { // Gracefully fail if we were unable to load the font. // Additionally UIFont is returning a different font family than expected, fallback to the system font - font = [UIFont systemFontOfSize:fontSize]; + CTFontSymbolicTraits symbolicTraits = CTFontGetSymbolicTraits(coreTextFont); + if (symbolicTraits & kCTFontTraitItalic) { + font = [UIFont italicSystemFontOfSize:fontSize]; + } else if (symbolicTraits & kCTFontTraitBold) { + font = [UIFont boldSystemFontOfSize:fontSize]; + } else { + font = [UIFont systemFontOfSize:fontSize]; + } } cleanAttributes[NSFontAttributeName] = font; } From a721603397a688e8b16ee3934c6f09ec635aaf8b Mon Sep 17 00:00:00 2001 From: Rahul Malik Date: Wed, 10 Jul 2019 14:50:15 -0700 Subject: [PATCH 3/4] Fix indentation --- Source/TextKit/ASTextKitCoreTextAdditions.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/TextKit/ASTextKitCoreTextAdditions.mm b/Source/TextKit/ASTextKitCoreTextAdditions.mm index 47b92b64d..ac38ff557 100644 --- a/Source/TextKit/ASTextKitCoreTextAdditions.mm +++ b/Source/TextKit/ASTextKitCoreTextAdditions.mm @@ -77,13 +77,13 @@ BOOL ASAttributeWithNameIsUnsupportedCoreTextAttribute(NSString *attributeName) // Gracefully fail if we were unable to load the font. // Additionally UIFont is returning a different font family than expected, fallback to the system font CTFontSymbolicTraits symbolicTraits = CTFontGetSymbolicTraits(coreTextFont); - if (symbolicTraits & kCTFontTraitItalic) { - font = [UIFont italicSystemFontOfSize:fontSize]; - } else if (symbolicTraits & kCTFontTraitBold) { - font = [UIFont boldSystemFontOfSize:fontSize]; - } else { - font = [UIFont systemFontOfSize:fontSize]; - } + if (symbolicTraits & kCTFontTraitItalic) { + font = [UIFont italicSystemFontOfSize:fontSize]; + } else if (symbolicTraits & kCTFontTraitBold) { + font = [UIFont boldSystemFontOfSize:fontSize]; + } else { + font = [UIFont systemFontOfSize:fontSize]; + } } cleanAttributes[NSFontAttributeName] = font; } From dab0b2794eff09bcbbb14525a75b39ac7ae6ae53 Mon Sep 17 00:00:00 2001 From: Rahul Malik Date: Wed, 10 Jul 2019 15:32:59 -0700 Subject: [PATCH 4/4] CTFontRef toll free bridges to UIFont on iOS. --- Source/TextKit/ASTextKitCoreTextAdditions.mm | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/Source/TextKit/ASTextKitCoreTextAdditions.mm b/Source/TextKit/ASTextKitCoreTextAdditions.mm index ac38ff557..df3df696c 100644 --- a/Source/TextKit/ASTextKitCoreTextAdditions.mm +++ b/Source/TextKit/ASTextKitCoreTextAdditions.mm @@ -68,24 +68,9 @@ BOOL ASAttributeWithNameIsUnsupportedCoreTextAttribute(NSString *attributeName) // kCTFontAttributeName -> NSFontAttributeName if ([coreTextKey isEqualToString:(NSString *)kCTFontAttributeName]) { + // Its reference type, CTFontRef, is toll-free bridged with UIFont in iOS and NSFont in OS X CTFontRef coreTextFont = (__bridge CTFontRef)coreTextValue; - NSString *fontName = (__bridge_transfer NSString *)CTFontCopyPostScriptName(coreTextFont); - CGFloat fontSize = CTFontGetSize(coreTextFont); - UIFont *font = [UIFont fontWithName:fontName size:fontSize]; - ASDisplayNodeCAssertNotNil(font, @"unable to load font %@ with size %f", fontName, fontSize); - if (font == nil || ![font.familyName isEqualToString:fontName]) { - // Gracefully fail if we were unable to load the font. - // Additionally UIFont is returning a different font family than expected, fallback to the system font - CTFontSymbolicTraits symbolicTraits = CTFontGetSymbolicTraits(coreTextFont); - if (symbolicTraits & kCTFontTraitItalic) { - font = [UIFont italicSystemFontOfSize:fontSize]; - } else if (symbolicTraits & kCTFontTraitBold) { - font = [UIFont boldSystemFontOfSize:fontSize]; - } else { - font = [UIFont systemFontOfSize:fontSize]; - } - } - cleanAttributes[NSFontAttributeName] = font; + cleanAttributes[NSFontAttributeName] = (__bridge UIFont *)coreTextFont; } // kCTKernAttributeName -> NSKernAttributeName else if ([coreTextKey isEqualToString:(NSString *)kCTKernAttributeName]) {