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
Fixes facebook#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.
  • Loading branch information
sophiebits committed Apr 23, 2015
1 parent 76e5439 commit f2b6721
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 @@ -94,21 +94,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 f2b6721

Please sign in to comment.