|
1 | 1 | #import "FRNFontMetrics.h" |
2 | 2 |
|
3 | 3 | static NSDictionary<NSString *, NSNumber *> *FRNRecognizedTextStyles() { |
4 | | - static NSDictionary<NSString *, NSNumber *> *styles; |
5 | | - static dispatch_once_t onceToken; |
6 | | - dispatch_once(&onceToken, ^{ |
7 | | - styles = @{ |
8 | | - @"caption1": @(FRNTextStyleCaption1), |
9 | | - @"caption2": @(FRNTextStyleCaption2), |
10 | | - @"footnote": @(FRNTextStyleFootnote), |
11 | | - @"subheadline": @(FRNTextStyleSubheadline), |
12 | | - @"callout": @(FRNTextStyleCallout), |
13 | | - @"body": @(FRNTextStyleBody), |
14 | | - @"headline": @(FRNTextStyleHeadline), |
15 | | - @"title3": @(FRNTextStyleTitle3), |
16 | | - @"title2": @(FRNTextStyleTitle2), |
17 | | - @"title1": @(FRNTextStyleTitle1), |
18 | | - @"largeTitle": @(FRNTextStyleLargeTitle), |
19 | | - }; |
20 | | - }); |
21 | | - return styles; |
| 4 | + static NSDictionary<NSString *, NSNumber *> *styles; |
| 5 | + static dispatch_once_t onceToken; |
| 6 | + dispatch_once(&onceToken, ^{ |
| 7 | + styles = @{ |
| 8 | + @"caption1" : @(FRNTextStyleCaption1), |
| 9 | + @"caption2" : @(FRNTextStyleCaption2), |
| 10 | + @"footnote" : @(FRNTextStyleFootnote), |
| 11 | + @"subheadline" : @(FRNTextStyleSubheadline), |
| 12 | + @"callout" : @(FRNTextStyleCallout), |
| 13 | + @"body" : @(FRNTextStyleBody), |
| 14 | + @"headline" : @(FRNTextStyleHeadline), |
| 15 | + @"title3" : @(FRNTextStyleTitle3), |
| 16 | + @"title2" : @(FRNTextStyleTitle2), |
| 17 | + @"title1" : @(FRNTextStyleTitle1), |
| 18 | + @"largeTitle" : @(FRNTextStyleLargeTitle), |
| 19 | + }; |
| 20 | + }); |
| 21 | + return styles; |
22 | 22 | } |
23 | 23 |
|
24 | 24 | @implementation RCTConvert (FRNTextStyle) |
25 | 25 |
|
26 | | -RCT_ENUM_CONVERTER(FRNTextStyle, FRNRecognizedTextStyles(), FRNTextStyleUndefined, integerValue) |
| 26 | +RCT_ENUM_CONVERTER(FRNTextStyle, FRNRecognizedTextStyles(), |
| 27 | + FRNTextStyleUndefined, integerValue) |
27 | 28 |
|
28 | 29 | @end |
29 | 30 |
|
30 | 31 | NS_ASSUME_NONNULL_BEGIN |
31 | 32 |
|
32 | 33 | UIFontMetrics *FRNUIFontMetricsForTextStyle(FRNTextStyle textStyle) { |
33 | | - static NSDictionary<NSNumber *, UIFontTextStyle> *mapping; |
34 | | - static dispatch_once_t onceToken; |
35 | | - dispatch_once(&onceToken, ^{ |
36 | | - mapping = @{ |
37 | | - @(FRNTextStyleCaption2): UIFontTextStyleCaption2, |
38 | | - @(FRNTextStyleCaption1): UIFontTextStyleCaption1, |
39 | | - @(FRNTextStyleFootnote): UIFontTextStyleFootnote, |
40 | | - @(FRNTextStyleSubheadline): UIFontTextStyleSubheadline, |
41 | | - @(FRNTextStyleCallout): UIFontTextStyleCallout, |
42 | | - @(FRNTextStyleBody): UIFontTextStyleBody, |
43 | | - @(FRNTextStyleHeadline): UIFontTextStyleHeadline, |
44 | | - @(FRNTextStyleTitle3): UIFontTextStyleTitle3, |
45 | | - @(FRNTextStyleTitle2): UIFontTextStyleTitle2, |
46 | | - @(FRNTextStyleTitle1): UIFontTextStyleTitle1, |
47 | | - @(FRNTextStyleLargeTitle): UIFontTextStyleLargeTitle, |
48 | | - }; |
49 | | - }); |
50 | | - |
51 | | - UIFontTextStyle uiFontTextStyle = mapping[@(textStyle)] ?: UIFontTextStyleBody; // Default to body if we don't recognize the specified ramp |
52 | | - return [UIFontMetrics metricsForTextStyle:uiFontTextStyle]; |
| 34 | + static NSDictionary<NSNumber *, UIFontTextStyle> *mapping; |
| 35 | + static dispatch_once_t onceToken; |
| 36 | + dispatch_once(&onceToken, ^{ |
| 37 | + mapping = @{ |
| 38 | + @(FRNTextStyleCaption2) : UIFontTextStyleCaption2, |
| 39 | + @(FRNTextStyleCaption1) : UIFontTextStyleCaption1, |
| 40 | + @(FRNTextStyleFootnote) : UIFontTextStyleFootnote, |
| 41 | + @(FRNTextStyleSubheadline) : UIFontTextStyleSubheadline, |
| 42 | + @(FRNTextStyleCallout) : UIFontTextStyleCallout, |
| 43 | + @(FRNTextStyleBody) : UIFontTextStyleBody, |
| 44 | + @(FRNTextStyleHeadline) : UIFontTextStyleHeadline, |
| 45 | + @(FRNTextStyleTitle3) : UIFontTextStyleTitle3, |
| 46 | + @(FRNTextStyleTitle2) : UIFontTextStyleTitle2, |
| 47 | + @(FRNTextStyleTitle1) : UIFontTextStyleTitle1, |
| 48 | + @(FRNTextStyleLargeTitle) : UIFontTextStyleLargeTitle, |
| 49 | + }; |
| 50 | + }); |
| 51 | + |
| 52 | + UIFontTextStyle uiFontTextStyle = |
| 53 | + mapping[@(textStyle)] |
| 54 | + ?: UIFontTextStyleBody; // Default to body if we don't recognize the |
| 55 | + // specified ramp |
| 56 | + return [UIFontMetrics metricsForTextStyle:uiFontTextStyle]; |
53 | 57 | } |
54 | 58 |
|
55 | 59 | CGFloat FRNBaseSizeForTextStyle(FRNTextStyle textStyle) { |
56 | | - static NSDictionary<NSNumber *, NSNumber *> *mapping; |
57 | | - static dispatch_once_t onceToken; |
58 | | - dispatch_once(&onceToken, ^{ |
59 | | - // Values taken from https://developer.apple.com/design/human-interface-guidelines/foundations/typography/#specifications |
60 | | - mapping = @{ |
61 | | - @(FRNTextStyleCaption2): @11, |
62 | | - @(FRNTextStyleCaption1): @12, |
63 | | - @(FRNTextStyleFootnote): @13, |
64 | | - @(FRNTextStyleSubheadline): @15, |
65 | | - @(FRNTextStyleCallout): @16, |
66 | | - @(FRNTextStyleBody): @17, |
67 | | - @(FRNTextStyleHeadline): @17, |
68 | | - @(FRNTextStyleTitle3): @20, |
69 | | - @(FRNTextStyleTitle2): @22, |
70 | | - @(FRNTextStyleTitle1): @28, |
71 | | - @(FRNTextStyleLargeTitle): @34, |
72 | | - }; |
73 | | - }); |
74 | | - |
75 | | - NSNumber *baseSize = mapping[@(textStyle)] ?: @17; // Default to body size if we don't recognize the specified ramp |
76 | | - return CGFLOAT_IS_DOUBLE ? [baseSize doubleValue] : [baseSize floatValue]; |
| 60 | + static NSDictionary<NSNumber *, NSNumber *> *mapping; |
| 61 | + static dispatch_once_t onceToken; |
| 62 | + dispatch_once(&onceToken, ^{ |
| 63 | + // Values taken from |
| 64 | + // https://developer.apple.com/design/human-interface-guidelines/typography/#Specifications |
| 65 | + mapping = @{ |
| 66 | + @(FRNTextStyleCaption2) : @11, |
| 67 | + @(FRNTextStyleCaption1) : @12, |
| 68 | + @(FRNTextStyleFootnote) : @13, |
| 69 | + @(FRNTextStyleSubheadline) : @15, |
| 70 | + @(FRNTextStyleCallout) : @16, |
| 71 | + @(FRNTextStyleBody) : @17, |
| 72 | + @(FRNTextStyleHeadline) : @17, |
| 73 | + @(FRNTextStyleTitle3) : @20, |
| 74 | + @(FRNTextStyleTitle2) : @22, |
| 75 | + @(FRNTextStyleTitle1) : @28, |
| 76 | + @(FRNTextStyleLargeTitle) : @34, |
| 77 | + }; |
| 78 | + }); |
| 79 | + |
| 80 | + NSNumber *baseSize = |
| 81 | + mapping[@(textStyle)] ?: @17; // Default to body size if we don't |
| 82 | + // recognize the specified ramp |
| 83 | + return CGFLOAT_IS_DOUBLE ? [baseSize doubleValue] : [baseSize floatValue]; |
77 | 84 | } |
78 | 85 |
|
79 | 86 | @implementation FRNFontMetrics { |
80 | | - BOOL _hasListeners; |
| 87 | + BOOL _hasListeners; |
81 | 88 | } |
82 | 89 |
|
83 | | -+ (BOOL)requiresMainQueueSetup |
84 | | -{ |
85 | | - return YES; |
| 90 | ++ (BOOL)requiresMainQueueSetup { |
| 91 | + return YES; |
86 | 92 | } |
87 | 93 |
|
88 | | -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(currentScaleFactors) |
89 | | -{ |
90 | | - NSMutableDictionary *result = [NSMutableDictionary new]; |
91 | | - [FRNRecognizedTextStyles() enumerateKeysAndObjectsUsingBlock:^(NSString * styleString, __unused NSNumber * boxedTextStyle, __unused BOOL * stop) { |
| 94 | +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(currentScaleFactors) { |
| 95 | + NSMutableDictionary *result = [NSMutableDictionary new]; |
| 96 | + [FRNRecognizedTextStyles() |
| 97 | + enumerateKeysAndObjectsUsingBlock:^(NSString *styleString, |
| 98 | + __unused NSNumber *boxedTextStyle, |
| 99 | + __unused BOOL *stop) { |
92 | 100 | result[styleString] = [self scaleFactorForStyle:styleString]; |
93 | | - }]; |
94 | | - return result; |
| 101 | + }]; |
| 102 | + return result; |
95 | 103 | } |
96 | 104 |
|
97 | | -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(scaleFactorForStyle:(NSString *)styleString) |
98 | | -{ |
99 | | - FRNTextStyle style = [RCTConvert FRNTextStyle:styleString]; |
100 | | - UIFontMetrics *fontMetrics = FRNUIFontMetricsForTextStyle(style); |
101 | | - CGFloat baseSize = FRNBaseSizeForTextStyle(style); |
102 | | - CGFloat scaleFactor = [fontMetrics scaledValueForValue:baseSize] / baseSize; |
103 | | - return @(scaleFactor); |
| 105 | +RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(scaleFactorForStyle |
| 106 | + : (NSString *)styleString) { |
| 107 | + FRNTextStyle style = [RCTConvert FRNTextStyle:styleString]; |
| 108 | + UIFontMetrics *fontMetrics = FRNUIFontMetricsForTextStyle(style); |
| 109 | + CGFloat baseSize = FRNBaseSizeForTextStyle(style); |
| 110 | + CGFloat scaleFactor = [fontMetrics scaledValueForValue:baseSize] / baseSize; |
| 111 | + return @(scaleFactor); |
104 | 112 | } |
105 | 113 |
|
106 | 114 | #pragma mark - RCTEventEmitter |
107 | 115 |
|
108 | | -- (NSArray<NSString *> *_Nullable)supportedEvents |
109 | | -{ |
110 | | - return @[ @"onFontMetricsChanged" ]; |
| 116 | +- (NSArray<NSString *> *_Nullable)supportedEvents { |
| 117 | + return @[ @"onFontMetricsChanged" ]; |
111 | 118 | } |
112 | 119 |
|
113 | | -- (void)startObserving |
114 | | -{ |
115 | | - _hasListeners = YES; |
116 | | - [[NSNotificationCenter defaultCenter] addObserver:self |
117 | | - selector:@selector(onFontMetricsChanged:) |
118 | | - name:UIContentSizeCategoryDidChangeNotification |
119 | | - object:nil]; |
| 120 | +- (void)startObserving { |
| 121 | + _hasListeners = YES; |
| 122 | + [[NSNotificationCenter defaultCenter] |
| 123 | + addObserver:self |
| 124 | + selector:@selector(onFontMetricsChanged:) |
| 125 | + name:UIContentSizeCategoryDidChangeNotification |
| 126 | + object:nil]; |
120 | 127 | } |
121 | 128 |
|
122 | | -- (void)stopObserving |
123 | | -{ |
124 | | - _hasListeners = NO; |
125 | | - [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 129 | +- (void)stopObserving { |
| 130 | + _hasListeners = NO; |
| 131 | + [[NSNotificationCenter defaultCenter] removeObserver:self]; |
126 | 132 | } |
127 | 133 |
|
128 | 134 | #pragma mark - Event processing |
129 | 135 |
|
130 | 136 | - (void)onFontMetricsChanged:(NSNotification *)notification { |
131 | | - if (_hasListeners) { |
132 | | - [self sendEventWithName:@"onFontMetricsChanged" body:@{@"newScaleFactors": [self currentScaleFactors]}]; |
133 | | - } |
| 137 | + if (_hasListeners) { |
| 138 | + [self sendEventWithName:@"onFontMetricsChanged" |
| 139 | + body:@{@"newScaleFactors" : [self currentScaleFactors]}]; |
| 140 | + } |
134 | 141 | } |
135 | 142 |
|
136 | 143 | RCT_EXPORT_MODULE(); |
|
0 commit comments