Skip to content

Commit

Permalink
Fix updating RCTText with new text of the same size
Browse files Browse the repository at this point in the history
Summary:
Fixes #979.

Previously, a Text whose width is determined automatically (as opposed to set by a container) would position the text incorrectly after an update to the text *if* the text's width did not change (i.e., when changing only digits in a font with tabular numbers).

Every time RCTShadowText's RCTMeasure runs, it sets the text container's size to be the maximum allowed size for the text. When RCTText's drawRect is called later, it relied on layoutSubviews having been called to set the text container's size back to the proper width. But if RCTMeasure returned the same dimensions as last time, then RCTText's frame wasn't reset and so layoutSubviews was never re-called. With this change, we set the textContainer's size each time we draw the text.

We could also fix this by using a different NSTextContainer instance in RCTMeasure. Not sure what the pros and cons of that are.
Closes #989
Github Author: Ben Alpert <[email protected]>

Test Plan: Imported from GitHub, without a `Test Plan:` line.
  • Loading branch information
sophiebits committed Apr 24, 2015
1 parent 4c9ed22 commit dd6f774
Showing 1 changed file with 8 additions and 11 deletions.
19 changes: 8 additions & 11 deletions Libraries/Text/RCTText.m
Original file line number Diff line number Diff line change
Expand Up @@ -95,21 +95,18 @@ - (CGRect)textFrame
return UIEdgeInsetsInsetRect(self.bounds, _contentInset);
}

- (void)layoutSubviews
- (void)drawRect:(CGRect)rect
{
[super layoutSubviews];
CGRect textFrame = [self textFrame];

// The header comment for `size` says that a height of 0.0 should be enough,
// but it isn't.
_textContainer.size = CGSizeMake([self textFrame].size.width, CGFLOAT_MAX);
}
// We reset the text container size every time because RCTShadowText's
// RCTMeasure overrides it. The header comment for `size` says that a height
// of 0.0 should be enough, but it isn't.
_textContainer.size = CGSizeMake(textFrame.size.width, CGFLOAT_MAX);

- (void)drawRect:(CGRect)rect
{
CGPoint origin = [self textFrame].origin;
NSRange glyphRange = [_layoutManager glyphRangeForTextContainer:_textContainer];
[_layoutManager drawBackgroundForGlyphRange:glyphRange atPoint:origin];
[_layoutManager drawGlyphsForGlyphRange:glyphRange atPoint:origin];
[_layoutManager drawBackgroundForGlyphRange:glyphRange atPoint:textFrame.origin];
[_layoutManager drawGlyphsForGlyphRange:glyphRange atPoint:textFrame.origin];
}

- (NSNumber *)reactTagAtPoint:(CGPoint)point
Expand Down

0 comments on commit dd6f774

Please sign in to comment.