Skip to content

Commit 5a67185

Browse files
committed
Support fallback fonts
1 parent f3a6539 commit 5a67185

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

Libraries/Text/RCTTextAttributes.m

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,27 +93,27 @@ - (NSParagraphStyle *)effectiveParagraphStyle
9393
alignment = NSTextAlignmentRight;
9494
}
9595
}
96-
96+
9797
paragraphStyle.alignment = alignment;
9898
isParagraphStyleUsed = YES;
9999
}
100-
100+
101101
if (_baseWritingDirection != NSWritingDirectionNatural) {
102102
paragraphStyle.baseWritingDirection = _baseWritingDirection;
103103
isParagraphStyleUsed = YES;
104104
}
105-
105+
106106
if (!isnan(_lineHeight)) {
107107
CGFloat lineHeight = _lineHeight * self.effectiveFontSizeMultiplier;
108108
paragraphStyle.minimumLineHeight = lineHeight;
109109
paragraphStyle.maximumLineHeight = lineHeight;
110110
isParagraphStyleUsed = YES;
111111
}
112-
112+
113113
if (isParagraphStyleUsed) {
114114
return [paragraphStyle copy];
115115
}
116-
116+
117117
return nil;
118118
}
119119

@@ -192,14 +192,50 @@ - (NSParagraphStyle *)effectiveParagraphStyle
192192

193193
- (UIFont *)effectiveFont
194194
{
195-
// FIXME: RCTFont has thread-safety issues and must be rewritten.
196-
return [RCTFont updateFont:nil
197-
withFamily:_fontFamily
198-
size:@(isnan(_fontSize) ? 0 : _fontSize)
199-
weight:_fontWeight
200-
style:_fontStyle
201-
variant:_fontVariant
202-
scaleMultiplier:self.effectiveFontSizeMultiplier];
195+
NSArray *rawFontFamilies = [_fontFamily componentsSeparatedByString:@","];
196+
197+
if (rawFontFamilies.count == 0) {
198+
return [RCTFont updateFont:nil
199+
withFamily:_fontFamily
200+
size:@(isnan(_fontSize) ? 0 : _fontSize)
201+
weight:_fontWeight
202+
style:_fontStyle
203+
variant:_fontVariant
204+
scaleMultiplier:self.effectiveFontSizeMultiplier];
205+
}
206+
207+
NSMutableArray *fonts = [NSMutableArray new];
208+
for (NSString *rawFontFamily in rawFontFamilies) {
209+
NSString *fontFamily = [rawFontFamily stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
210+
if (fontFamily.length == 0) {
211+
continue;
212+
}
213+
214+
UIFont *font = [RCTFont updateFont:nil
215+
withFamily:fontFamily
216+
size:@(isnan(_fontSize) ? 0 : _fontSize)
217+
weight:_fontWeight
218+
style:_fontStyle
219+
variant:_fontVariant
220+
scaleMultiplier:self.effectiveFontSizeMultiplier];
221+
222+
if (font) {
223+
[fonts addObject:font];
224+
}
225+
}
226+
227+
UIFont *primaryFont = fonts[0];
228+
229+
NSMutableArray *fontDescriptors = [NSMutableArray new];
230+
for (NSUInteger i = 1; i < fonts.count; i++) {
231+
UIFont *font = fonts[i];
232+
[fontDescriptors addObject:font.fontDescriptor];
233+
}
234+
235+
UIFontDescriptor *fontDescriptor = [primaryFont.fontDescriptor fontDescriptorByAddingAttributes:
236+
@{UIFontDescriptorCascadeListAttribute: fontDescriptors}];
237+
238+
return [UIFont fontWithDescriptor:fontDescriptor size:primaryFont.pointSize];
203239
}
204240

205241
- (CGFloat)effectiveFontSizeMultiplier
@@ -243,7 +279,7 @@ - (UIColor *)effectiveBackgroundColor
243279
NSMutableArray *newWords = [NSMutableArray new];
244280
NSNumberFormatter *num = [NSNumberFormatter new];
245281
for (NSString *item in words) {
246-
NSString *word;
282+
NSString *word;
247283
if ([item length] > 0 && [num numberFromString:[item substringWithRange:NSMakeRange(0, 1)]] == nil) {
248284
word = [item capitalizedString];
249285
} else {

0 commit comments

Comments
 (0)