@@ -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