From 0a319978ffdce459da1d3db1f3a14e1bf137b5e2 Mon Sep 17 00:00:00 2001 From: Neo Date: Wed, 6 Sep 2017 23:43:17 -0700 Subject: [PATCH] fix fontWeight regression Summary: fix the regression I mentioned in https://github.com/facebook/react-native/pull/15162#issuecomment-319696706 as no one is working on this, I take the step, although I know nothing about Objective C I find the key point is that the keys in `NSDictionary` are not ordered as presented, it's a hash table, so no grantee on keys order, so I create a new array to do that, then it will check `ultralight` before `light` and `semibold` before `bold` Closes https://github.com/facebook/react-native/pull/15825 Differential Revision: D5782142 Pulled By: shergin fbshipit-source-id: 5346b0cb263e535c0b445e7a2912c452573248a5 --- React/Views/RCTFont.mm | 51 ++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/React/Views/RCTFont.mm b/React/Views/RCTFont.mm index 98164b95780007..c75a2b96702fba 100644 --- a/React/Views/RCTFont.mm +++ b/React/Views/RCTFont.mm @@ -36,33 +36,46 @@ typedef CGFloat RCTFontWeight; static RCTFontWeight weightOfFont(UIFont *font) { - static NSDictionary *nameToWeight; + static NSArray *fontNames; + static NSArray *fontWeights; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - nameToWeight = @{ - @"normal": @(UIFontWeightRegular), - @"bold": @(UIFontWeightBold), - @"ultralight": @(UIFontWeightUltraLight), - @"thin": @(UIFontWeightThin), - @"light": @(UIFontWeightLight), - @"regular": @(UIFontWeightRegular), - @"medium": @(UIFontWeightMedium), - @"semibold": @(UIFontWeightSemibold), - @"bold": @(UIFontWeightBold), - @"heavy": @(UIFontWeightHeavy), - @"black": @(UIFontWeightBlack), - }; + // We use two arrays instead of one map because + // the order is important for suffix matching. + fontNames = @[ + @"normal", + @"ultralight", + @"thin", + @"light", + @"regular", + @"medium", + @"semibold", + @"bold", + @"heavy", + @"black" + ]; + fontWeights = @[ + @(UIFontWeightRegular), + @(UIFontWeightUltraLight), + @(UIFontWeightThin), + @(UIFontWeightLight), + @(UIFontWeightRegular), + @(UIFontWeightMedium), + @(UIFontWeightSemibold), + @(UIFontWeightBold), + @(UIFontWeightHeavy), + @(UIFontWeightBlack) + ]; }); - for (NSString *name in nameToWeight) { - if ([font.fontName.lowercaseString hasSuffix:name]) { - return [nameToWeight[name] doubleValue]; + for (NSInteger i = 0; i < fontNames.count; i++) { + if ([font.fontName.lowercaseString hasSuffix:fontNames[i]]) { + return (RCTFontWeight)[fontWeights[i] doubleValue]; } } NSDictionary *traits = [font.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute]; - RCTFontWeight weight = [traits[UIFontWeightTrait] doubleValue]; - return weight; + return (RCTFontWeight)[traits[UIFontWeightTrait] doubleValue]; } static BOOL isItalicFont(UIFont *font)