Re-render views when direction changes
Reviewed By: shergin Differential Revision: D5959573 fbshipit-source-id: 36b2cde921362a934a2c88a3ed05be5082ed08bf
This commit is contained in:
parent
bbcfcdb8ed
commit
992ade1fc5
|
@ -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 {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -497,7 +497,7 @@ static NSDictionary *deviceOrientationEventBody(UIDeviceOrientation orientation)
|
|||
reactTags[index] = shadowView.reactTag;
|
||||
frameDataArray[index++] = (RCTFrameData){
|
||||
shadowView.frame,
|
||||
shadowView.effectiveLayoutDirection,
|
||||
shadowView.layoutDirection,
|
||||
shadowView.isNewView,
|
||||
shadowView.superview.isNewView,
|
||||
shadowView.isHidden,
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
absolutePosition:(CGPoint)absolutePosition
|
||||
{
|
||||
// Call super method if LTR layout is enforced.
|
||||
if (self.effectiveLayoutDirection == UIUserInterfaceLayoutDirectionLeftToRight) {
|
||||
if (YGNodeLayoutGetDirection(self.yogaNode) != YGDirectionRTL) {
|
||||
[super applyLayoutNode:node
|
||||
viewsWithNewFrame:viewsWithNewFrame
|
||||
absolutePosition:absolutePosition];
|
||||
|
|
|
@ -84,9 +84,10 @@ typedef void (^RCTApplierBlock)(NSDictionary<NSNumber *, UIView *> *viewRegistry
|
|||
@property (nonatomic, assign, getter=isHidden) BOOL hidden;
|
||||
|
||||
/**
|
||||
* Computed layout direction for the view backed to Yoga node value.
|
||||
* Computed layout direction of the view.
|
||||
*/
|
||||
@property (nonatomic, assign, readonly) UIUserInterfaceLayoutDirection effectiveLayoutDirection;
|
||||
|
||||
@property (nonatomic, assign, readonly) UIUserInterfaceLayoutDirection layoutDirection;
|
||||
|
||||
/**
|
||||
* Position and dimensions.
|
||||
|
|
|
@ -204,8 +204,13 @@ static void RCTProcessMetaPropsBorder(const YGValue metaProps[META_PROP_COUNT],
|
|||
RCTRoundPixelValue(absoluteBottomRight.y - absoluteTopLeft.y)
|
||||
}};
|
||||
|
||||
if (!CGRectEqualToRect(frame, _frame)) {
|
||||
// Even if `YGNodeLayoutGetDirection` can return `YGDirectionInherit` here, it actually means
|
||||
// that Yoga will use LTR layout for the view (even if layout process is not finished yet).
|
||||
UIUserInterfaceLayoutDirection updatedLayoutDirection = YGNodeLayoutGetDirection(_yogaNode) == YGDirectionRTL ? UIUserInterfaceLayoutDirectionRightToLeft : UIUserInterfaceLayoutDirectionLeftToRight;
|
||||
|
||||
if (!CGRectEqualToRect(frame, _frame) || _layoutDirection != updatedLayoutDirection) {
|
||||
_frame = frame;
|
||||
_layoutDirection = updatedLayoutDirection;
|
||||
[viewsWithNewFrame addObject:self];
|
||||
}
|
||||
|
||||
|
@ -491,14 +496,6 @@ static void RCTProcessMetaPropsBorder(const YGValue metaProps[META_PROP_COUNT],
|
|||
return description;
|
||||
}
|
||||
|
||||
// Layout Direction
|
||||
|
||||
- (UIUserInterfaceLayoutDirection)effectiveLayoutDirection {
|
||||
// Even if `YGNodeLayoutGetDirection` can return `YGDirectionInherit` here, it actually means
|
||||
// that Yoga will use LTR layout for the view (even if layout process is not finished yet).
|
||||
return YGNodeLayoutGetDirection(_yogaNode) == YGDirectionRTL ? UIUserInterfaceLayoutDirectionRightToLeft : UIUserInterfaceLayoutDirectionLeftToRight;
|
||||
}
|
||||
|
||||
// Margin
|
||||
|
||||
#define RCT_MARGIN_PROPERTY(prop, metaProp) \
|
||||
|
|
Loading…
Reference in New Issue