mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-24 04:16:00 +08:00
Re-render views when direction changes
Summary: This is required for D5874536, wherein I'll be introducing direction-aware props for borders. When a view's border changes due to a direction update, only the frames of its children update. Therefore, only the children `UIView`s get a chance to be re-rendered. This is incorrect because the view that's had its borders changed also needs to re-render. So, I keep a track of the layout direction in a property on all shadow views. Then, when I update that prop within `applyLayoutNode`, I push shadow views into the `viewsWithNewFrames` set. Reviewed By: mmmulani Differential Revision: D5944488 fbshipit-source-id: 3f23e9973f3555612920703cdb6cec38e6360d2d
This commit is contained in:
committed by
Facebook Github Bot
parent
53a339a459
commit
9bbc70c442
@@ -38,7 +38,7 @@ static CGFloat const kAutoSizeGranularity = 0.001f;
|
||||
CGFloat _cachedTextStorageWidthMode;
|
||||
NSAttributedString *_cachedAttributedString;
|
||||
CGFloat _effectiveLetterSpacing;
|
||||
UIUserInterfaceLayoutDirection _cachedEffectiveLayoutDirection;
|
||||
UIUserInterfaceLayoutDirection _cachedLayoutDirection;
|
||||
}
|
||||
|
||||
static YGSize RCTMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode)
|
||||
@@ -72,7 +72,7 @@ static YGSize RCTMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, f
|
||||
_fontSizeMultiplier = 1.0;
|
||||
_textAlign = NSTextAlignmentNatural;
|
||||
_writingDirection = NSWritingDirectionNatural;
|
||||
_cachedEffectiveLayoutDirection = UIUserInterfaceLayoutDirectionLeftToRight;
|
||||
_cachedLayoutDirection = UIUserInterfaceLayoutDirectionLeftToRight;
|
||||
|
||||
YGNodeSetMeasureFunc(self.yogaNode, RCTMeasure);
|
||||
|
||||
@@ -198,7 +198,7 @@ static YGSize RCTMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, f
|
||||
_cachedTextStorage &&
|
||||
(width == _cachedTextStorageWidth || (isnan(width) && isnan(_cachedTextStorageWidth))) &&
|
||||
widthMode == _cachedTextStorageWidthMode &&
|
||||
_cachedEffectiveLayoutDirection == self.effectiveLayoutDirection
|
||||
_cachedLayoutDirection == self.layoutDirection
|
||||
) {
|
||||
return _cachedTextStorage;
|
||||
}
|
||||
@@ -272,12 +272,12 @@ static YGSize RCTMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, f
|
||||
if (
|
||||
![self isTextDirty] &&
|
||||
_cachedAttributedString &&
|
||||
_cachedEffectiveLayoutDirection == self.effectiveLayoutDirection
|
||||
_cachedLayoutDirection == self.layoutDirection
|
||||
) {
|
||||
return _cachedAttributedString;
|
||||
}
|
||||
|
||||
_cachedEffectiveLayoutDirection = self.effectiveLayoutDirection;
|
||||
_cachedLayoutDirection = self.layoutDirection;
|
||||
|
||||
if (_fontSize && !isnan(_fontSize)) {
|
||||
fontSize = @(_fontSize);
|
||||
@@ -419,7 +419,7 @@ static YGSize RCTMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, f
|
||||
// Text alignment
|
||||
NSTextAlignment textAlign = _textAlign;
|
||||
if (textAlign == NSTextAlignmentRight || textAlign == NSTextAlignmentLeft) {
|
||||
if (_cachedEffectiveLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
|
||||
if (_cachedLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
|
||||
if (textAlign == NSTextAlignmentRight) {
|
||||
textAlign = NSTextAlignmentLeft;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user