From d77a692f2cdd19436272ca1abfae37fd8743a60c Mon Sep 17 00:00:00 2001 From: Tucker Connelly Date: Tue, 17 May 2016 10:30:58 -0400 Subject: [PATCH 1/2] Vertically center iOS text if lineHeight is set Change baseline formatting for PR Handle unset fontSizes in baseline calculation Put baseline comment on the right line --- Libraries/Text/RCTShadowText.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Libraries/Text/RCTShadowText.m b/Libraries/Text/RCTShadowText.m index 32e73997facaa7..2f5980a9772206 100644 --- a/Libraries/Text/RCTShadowText.m +++ b/Libraries/Text/RCTShadowText.m @@ -409,6 +409,14 @@ - (void)_setParagraphStyleOnAttributedString:(NSMutableAttributedString *)attrib } paragraphStyle.minimumLineHeight = lineHeight; paragraphStyle.maximumLineHeight = lineHeight; + + // vertically center text + CGFloat fontSize = _fontSize && !isnan(_fontSize) ? _fontSize : UIFont.systemFontSize; + fontSize *= fontSizeMultiplier; + + [attributedString addAttribute:NSBaselineOffsetAttributeName + value:@(lineHeight/2 - fontSize/2) + range:(NSRange){0, attributedString.length}]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:(NSRange){0, attributedString.length}]; From 4028fdeb7a2079267dcc167ec9b8b83524fccc99 Mon Sep 17 00:00:00 2001 From: Tucker Connelly Date: Sun, 17 Jul 2016 16:29:50 -0400 Subject: [PATCH 2/2] Add IOSLineHeight prop --- .../testTextExample_1@2x.png | Bin 373285 -> 372767 bytes Examples/UIExplorer/js/TextExample.ios.js | 12 ++++++++++ Libraries/Text/RCTShadowText.h | 1 + Libraries/Text/RCTShadowText.m | 21 ++++++++++-------- Libraries/Text/RCTTextManager.m | 1 + Libraries/Text/TextStylePropTypes.js | 6 +++++ 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-js-UIExplorerApp.ios/testTextExample_1@2x.png b/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-js-UIExplorerApp.ios/testTextExample_1@2x.png index 41970dbac17737b050c3c3b946dd144f06406db3..cec7ad5bc743fbc2f074b596e634af323432da86 100644 GIT binary patch delta 26025 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 ); }, +}, { + title: 'IOS Line Height', + render: function() { + return ( + + + A lot of space between the lines of this long passage that should + wrap twice. This text is vertically centered. + + + ); + }, }, { title: 'Empty Text', description: 'It\'s ok to have Text with zero or null children.', diff --git a/Libraries/Text/RCTShadowText.h b/Libraries/Text/RCTShadowText.h index ed0cc5d6a1a5b5..bae4a112290104 100644 --- a/Libraries/Text/RCTShadowText.h +++ b/Libraries/Text/RCTShadowText.h @@ -23,6 +23,7 @@ extern NSString *const RCTReactTagAttributeName; @property (nonatomic, assign) BOOL isHighlighted; @property (nonatomic, assign) CGFloat letterSpacing; @property (nonatomic, assign) CGFloat lineHeight; +@property (nonatomic, assign) CGFloat IOSLineHeight; @property (nonatomic, assign) NSUInteger numberOfLines; @property (nonatomic, assign) NSLineBreakMode lineBreakMode; @property (nonatomic, assign) CGSize shadowOffset; diff --git a/Libraries/Text/RCTShadowText.m b/Libraries/Text/RCTShadowText.m index 2f5980a9772206..39ae79ad59b45f 100644 --- a/Libraries/Text/RCTShadowText.m +++ b/Libraries/Text/RCTShadowText.m @@ -347,11 +347,11 @@ - (void)_setParagraphStyleOnAttributedString:(NSMutableAttributedString *)attrib { // check if we have lineHeight set on self __block BOOL hasParagraphStyle = NO; - if (_lineHeight || _textAlign) { + if (_IOSLineHeight || _lineHeight || _textAlign) { hasParagraphStyle = YES; } - __block float newLineHeight = _lineHeight ?: 0.0; + __block float newLineHeight = _IOSLineHeight ?: _lineHeight ?: 0.0; CGFloat fontSizeMultiplier = _allowFontScaling ? _fontSizeMultiplier : 1.0; @@ -403,20 +403,22 @@ - (void)_setParagraphStyleOnAttributedString:(NSMutableAttributedString *)attrib NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; paragraphStyle.alignment = _textAlign; paragraphStyle.baseWritingDirection = _writingDirection; - CGFloat lineHeight = round(_lineHeight * fontSizeMultiplier); + CGFloat lineHeight = round(newLineHeight * fontSizeMultiplier); if (heightOfTallestSubview > lineHeight) { lineHeight = ceilf(heightOfTallestSubview); } paragraphStyle.minimumLineHeight = lineHeight; paragraphStyle.maximumLineHeight = lineHeight; - // vertically center text - CGFloat fontSize = _fontSize && !isnan(_fontSize) ? _fontSize : UIFont.systemFontSize; - fontSize *= fontSizeMultiplier; + if (_IOSLineHeight) { + // vertically center text + CGFloat fontSize = _fontSize && !isnan(_fontSize) ? _fontSize : UIFont.systemFontSize; + fontSize *= fontSizeMultiplier; - [attributedString addAttribute:NSBaselineOffsetAttributeName - value:@(lineHeight/2 - fontSize/2) - range:(NSRange){0, attributedString.length}]; + [attributedString addAttribute:NSBaselineOffsetAttributeName + value:@(lineHeight/2 - fontSize/2) + range:(NSRange){0, attributedString.length}]; + } [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:(NSRange){0, attributedString.length}]; @@ -490,6 +492,7 @@ - (void)set##setProp:(type)value; \ RCT_TEXT_PROPERTY(IsHighlighted, _isHighlighted, BOOL) RCT_TEXT_PROPERTY(LetterSpacing, _letterSpacing, CGFloat) RCT_TEXT_PROPERTY(LineHeight, _lineHeight, CGFloat) +RCT_TEXT_PROPERTY(IOSLineHeight, _IOSLineHeight, CGFloat) RCT_TEXT_PROPERTY(NumberOfLines, _numberOfLines, NSUInteger) RCT_TEXT_PROPERTY(LineBreakMode, _lineBreakMode, NSLineBreakMode) RCT_TEXT_PROPERTY(TextAlign, _textAlign, NSTextAlignment) diff --git a/Libraries/Text/RCTTextManager.m b/Libraries/Text/RCTTextManager.m index 676ff9bb2063b8..34eb4f5a67bd87 100644 --- a/Libraries/Text/RCTTextManager.m +++ b/Libraries/Text/RCTTextManager.m @@ -63,6 +63,7 @@ - (RCTShadowView *)shadowView RCT_EXPORT_SHADOW_PROPERTY(isHighlighted, BOOL) RCT_EXPORT_SHADOW_PROPERTY(letterSpacing, CGFloat) RCT_EXPORT_SHADOW_PROPERTY(lineHeight, CGFloat) +RCT_EXPORT_SHADOW_PROPERTY(IOSLineHeight, CGFloat) RCT_EXPORT_SHADOW_PROPERTY(numberOfLines, NSUInteger) RCT_EXPORT_SHADOW_PROPERTY(lineBreakMode, NSLineBreakMode) RCT_EXPORT_SHADOW_PROPERTY(textAlign, NSTextAlignment) diff --git a/Libraries/Text/TextStylePropTypes.js b/Libraries/Text/TextStylePropTypes.js index daa3094a6361c8..381d1eae2b2043 100644 --- a/Libraries/Text/TextStylePropTypes.js +++ b/Libraries/Text/TextStylePropTypes.js @@ -40,6 +40,12 @@ var TextStylePropTypes = Object.assign(Object.create(ViewStylePropTypes), { */ letterSpacing: ReactPropTypes.number, lineHeight: ReactPropTypes.number, + /** + * @platform ios + * + * Vertically centers the text within a line on iOS. + */ + IOSLineHeight: ReactPropTypes.number, /** * Specifies text alignment. The value 'justify' is only supported on iOS and * fallbacks to `left` on Android.