mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-05-25 06:00:26 +08:00
Import css-layout measure mode changes from pull request #163
Reviewed By: lucasr Differential Revision: D3167760 fb-gh-sync-id: f4f13bcb09a2d8b2db2764bd31fa8cbd8edb484b fbshipit-source-id: f4f13bcb09a2d8b2db2764bd31fa8cbd8edb484b
This commit is contained in:
committed by
Facebook Github Bot 4
parent
2039be9d32
commit
303428ea28
@@ -26,14 +26,15 @@ NSString *const RCTReactTagAttributeName = @"ReactTagAttributeName";
|
||||
{
|
||||
NSTextStorage *_cachedTextStorage;
|
||||
CGFloat _cachedTextStorageWidth;
|
||||
CGFloat _cachedTextStorageWidthMode;
|
||||
NSAttributedString *_cachedAttributedString;
|
||||
CGFloat _effectiveLetterSpacing;
|
||||
}
|
||||
|
||||
static css_dim_t RCTMeasure(void *context, float width, float height)
|
||||
static css_dim_t RCTMeasure(void *context, float width, css_measure_mode_t widthMode, float height, css_measure_mode_t heightMode)
|
||||
{
|
||||
RCTShadowText *shadowText = (__bridge RCTShadowText *)context;
|
||||
NSTextStorage *textStorage = [shadowText buildTextStorageForWidth:width];
|
||||
NSTextStorage *textStorage = [shadowText buildTextStorageForWidth:width widthMode:widthMode];
|
||||
NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
|
||||
NSTextContainer *textContainer = layoutManager.textContainers.firstObject;
|
||||
CGSize computedSize = [layoutManager usedRectForTextContainer:textContainer].size;
|
||||
@@ -55,6 +56,8 @@ static css_dim_t RCTMeasure(void *context, float width, float height)
|
||||
_isHighlighted = NO;
|
||||
_textDecorationStyle = NSUnderlineStyleSingle;
|
||||
_opacity = 1.0;
|
||||
_cachedTextStorageWidth = -1;
|
||||
_cachedTextStorageWidthMode = -1;
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(contentSizeMultiplierDidChange:)
|
||||
name:RCTUIManagerWillUpdateViewsDueToContentSizeMultiplierChangeNotification
|
||||
@@ -89,7 +92,8 @@ static css_dim_t RCTMeasure(void *context, float width, float height)
|
||||
UIEdgeInsets padding = self.paddingAsInsets;
|
||||
CGFloat width = self.frame.size.width - (padding.left + padding.right);
|
||||
|
||||
NSTextStorage *textStorage = [self buildTextStorageForWidth:width];
|
||||
// HACK (t10802067)
|
||||
NSTextStorage *textStorage = [self buildTextStorageForWidth:width widthMode:isnan(width) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY];
|
||||
[applierBlocks addObject:^(NSDictionary<NSNumber *, RCTText *> *viewRegistry) {
|
||||
RCTText *view = viewRegistry[self.reactTag];
|
||||
view.textStorage = textStorage;
|
||||
@@ -106,9 +110,9 @@ static css_dim_t RCTMeasure(void *context, float width, float height)
|
||||
[self dirtyPropagation];
|
||||
}
|
||||
|
||||
- (NSTextStorage *)buildTextStorageForWidth:(CGFloat)width
|
||||
- (NSTextStorage *)buildTextStorageForWidth:(CGFloat)width widthMode:(css_measure_mode_t)widthMode
|
||||
{
|
||||
if (_cachedTextStorage && width == _cachedTextStorageWidth) {
|
||||
if (_cachedTextStorage && width == _cachedTextStorageWidth && widthMode == _cachedTextStorageWidthMode) {
|
||||
return _cachedTextStorage;
|
||||
}
|
||||
|
||||
@@ -121,12 +125,13 @@ static css_dim_t RCTMeasure(void *context, float width, float height)
|
||||
textContainer.lineFragmentPadding = 0.0;
|
||||
textContainer.lineBreakMode = _numberOfLines > 0 ? NSLineBreakByTruncatingTail : NSLineBreakByClipping;
|
||||
textContainer.maximumNumberOfLines = _numberOfLines;
|
||||
textContainer.size = (CGSize){isnan(width) ? CGFLOAT_MAX : width, CGFLOAT_MAX};
|
||||
textContainer.size = (CGSize){widthMode == CSS_MEASURE_MODE_UNDEFINED ? CGFLOAT_MAX : width, CGFLOAT_MAX};
|
||||
|
||||
[layoutManager addTextContainer:textContainer];
|
||||
[layoutManager ensureLayoutForTextContainer:textContainer];
|
||||
|
||||
_cachedTextStorageWidth = width;
|
||||
_cachedTextStorageWidthMode = widthMode;
|
||||
_cachedTextStorage = textStorage;
|
||||
|
||||
return textStorage;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#import "RCTTextManager.h"
|
||||
|
||||
#import "Layout.h"
|
||||
#import "RCTAccessibilityManager.h"
|
||||
#import "RCTAssert.h"
|
||||
#import "RCTConvert.h"
|
||||
@@ -21,7 +22,7 @@
|
||||
|
||||
@interface RCTShadowText (Private)
|
||||
|
||||
- (NSTextStorage *)buildTextStorageForWidth:(CGFloat)width;
|
||||
- (NSTextStorage *)buildTextStorageForWidth:(CGFloat)width widthMode:(css_measure_mode_t)widthMode;
|
||||
|
||||
@end
|
||||
|
||||
@@ -134,7 +135,9 @@ RCT_EXPORT_SHADOW_PROPERTY(textShadowColor, UIColor)
|
||||
|
||||
UIEdgeInsets padding = shadowText.paddingAsInsets;
|
||||
CGFloat width = shadowText.frame.size.width - (padding.left + padding.right);
|
||||
NSTextStorage *textStorage = [shadowText buildTextStorageForWidth:width];
|
||||
|
||||
// HACK (t10802067)
|
||||
NSTextStorage *textStorage = [shadowText buildTextStorageForWidth:width widthMode:isnan(width) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY];
|
||||
|
||||
[uiBlocks addObject:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, RCTTextView *> *viewRegistry) {
|
||||
RCTTextView *textView = viewRegistry[reactTag];
|
||||
|
||||
Reference in New Issue
Block a user