mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-26 05:15:49 +08:00
[Text] Get the system font instead of Helvetica programmatically and add a virtual fontName called "System"
Summary: Get the system font instead of Helvetica programmatically and add a virtual fontName called "System" that defaults to whatever the current system font is. #1611 Closes https://github.com/facebook/react-native/pull/1635 Github Author: LYK <dalinaum@gmail.com>
This commit is contained in:
@@ -788,7 +788,8 @@ static BOOL RCTFontIsCondensed(UIFont *font)
|
||||
size:(id)size weight:(id)weight style:(id)style
|
||||
{
|
||||
// Defaults
|
||||
NSString *const RCTDefaultFontFamily = @"Helvetica Neue";
|
||||
NSString *const RCTDefaultFontFamily = @"System";
|
||||
NSString *const RCTIOS8SystemFontFamily = @"Helvetica Neue";
|
||||
const RCTFontWeight RCTDefaultFontWeight = UIFontWeightRegular;
|
||||
const CGFloat RCTDefaultFontSize = 14;
|
||||
|
||||
@@ -807,11 +808,36 @@ static BOOL RCTFontIsCondensed(UIFont *font)
|
||||
isCondensed = RCTFontIsCondensed(font);
|
||||
}
|
||||
|
||||
// Get font size
|
||||
// Get font attributes
|
||||
fontSize = [self CGFloat:size] ?: fontSize;
|
||||
|
||||
// Get font family
|
||||
familyName = [self NSString:family] ?: familyName;
|
||||
isItalic = style ? [self RCTFontStyle:style] : isItalic;
|
||||
fontWeight = weight ? [self RCTFontWeight:weight] : fontWeight;
|
||||
|
||||
// Handle system font as special case. This ensures that we preserve
|
||||
// the specific metrics of the standard system font as closely as possible.
|
||||
if ([familyName isEqual:RCTDefaultFontFamily]) {
|
||||
if ([UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]) {
|
||||
font = [UIFont systemFontOfSize:fontSize weight:fontWeight];
|
||||
if (isItalic || isCondensed) {
|
||||
UIFontDescriptor *fontDescriptor = [font fontDescriptor];
|
||||
UIFontDescriptorSymbolicTraits symbolicTraits = fontDescriptor.symbolicTraits;
|
||||
if (isItalic) {
|
||||
symbolicTraits |= UIFontDescriptorTraitItalic;
|
||||
}
|
||||
if (isCondensed) {
|
||||
symbolicTraits |= UIFontDescriptorTraitCondensed;
|
||||
}
|
||||
fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:symbolicTraits];
|
||||
font = [UIFont fontWithDescriptor:fontDescriptor size:fontSize];
|
||||
}
|
||||
return font;
|
||||
} else {
|
||||
// systemFontOfSize:weight: isn't available prior to iOS 8.2, so we
|
||||
// fall back to finding the correct font manually, by linear search.
|
||||
familyName = RCTIOS8SystemFontFamily;
|
||||
}
|
||||
}
|
||||
|
||||
// Gracefully handle being given a font name rather than font family, for
|
||||
// example: "Helvetica Light Oblique" rather than just "Helvetica".
|
||||
@@ -821,30 +847,25 @@ static BOOL RCTFontIsCondensed(UIFont *font)
|
||||
// It's actually a font name, not a font family name,
|
||||
// but we'll do what was meant, not what was said.
|
||||
familyName = font.familyName;
|
||||
fontWeight = RCTWeightOfFont(font);
|
||||
isItalic = RCTFontIsItalic(font);
|
||||
fontWeight = weight ? fontWeight : RCTWeightOfFont(font);
|
||||
isItalic = style ? isItalic : RCTFontIsItalic(font);
|
||||
isCondensed = RCTFontIsCondensed(font);
|
||||
} else {
|
||||
// Not a valid font or family
|
||||
RCTLogError(@"Unrecognized font family '%@'", familyName);
|
||||
familyName = RCTDefaultFontFamily;
|
||||
if ([UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]) {
|
||||
font = [UIFont systemFontOfSize:fontSize weight:fontWeight];
|
||||
} else if (fontWeight > UIFontWeightRegular) {
|
||||
font = [UIFont boldSystemFontOfSize:fontSize];
|
||||
} else {
|
||||
font = [UIFont systemFontOfSize:fontSize];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get font style
|
||||
if (style) {
|
||||
isItalic = [self RCTFontStyle:style];
|
||||
}
|
||||
|
||||
// Get font weight
|
||||
if (weight) {
|
||||
fontWeight = [self RCTFontWeight:weight];
|
||||
}
|
||||
|
||||
// Get the closest font that matches the given weight for the fontFamily
|
||||
UIFont *bestMatch = [UIFont fontWithName:font.fontName size: fontSize];
|
||||
UIFont *bestMatch = font;
|
||||
CGFloat closestWeight = INFINITY;
|
||||
|
||||
for (NSString *name in [UIFont fontNamesForFamilyName:familyName]) {
|
||||
UIFont *match = [UIFont fontWithName:name size:fontSize];
|
||||
if (isItalic == RCTFontIsItalic(match) &&
|
||||
@@ -857,14 +878,6 @@ static BOOL RCTFontIsCondensed(UIFont *font)
|
||||
}
|
||||
}
|
||||
|
||||
// Safety net
|
||||
if (!bestMatch) {
|
||||
RCTLogError(@"Could not find font with family: '%@', size: %@, \
|
||||
weight: %@, style: %@", family, size, weight, style);
|
||||
bestMatch = [UIFont fontWithName:[[UIFont fontNamesForFamilyName:familyName] firstObject]
|
||||
size:fontSize];
|
||||
}
|
||||
|
||||
return bestMatch;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
NSArray *_argumentBlocks;
|
||||
}
|
||||
|
||||
RCT_NOT_IMPLEMENTED(-init)
|
||||
|
||||
- (instancetype)initWithObjCMethodName:(NSString *)objCMethodName
|
||||
JSMethodName:(NSString *)JSMethodName
|
||||
moduleClass:(Class)moduleClass
|
||||
|
||||
Reference in New Issue
Block a user