`base-line` metric exposure for <Text>
Summary: Now <Text> exposes base-line metric to Yoga. Before: https://cl.ly/1F0B0D430U3e After: https://cl.ly/0G1Q29450O0y Reviewed By: yungsters Differential Revision: D6957055 fbshipit-source-id: 04c1df693915e294b54e3c33e0aea21611dcc232
This commit is contained in:
parent
7630a614e4
commit
51b3529f6c
|
@ -31,6 +31,7 @@
|
||||||
_cachedTextStorages = [NSMapTable strongToStrongObjectsMapTable];
|
_cachedTextStorages = [NSMapTable strongToStrongObjectsMapTable];
|
||||||
_needsUpdateView = YES;
|
_needsUpdateView = YES;
|
||||||
YGNodeSetMeasureFunc(self.yogaNode, RCTTextShadowViewMeasure);
|
YGNodeSetMeasureFunc(self.yogaNode, RCTTextShadowViewMeasure);
|
||||||
|
YGNodeSetBaselineFunc(self.yogaNode, RCTTextShadowViewBaseline);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
@ -307,6 +308,27 @@
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (CGFloat)lastBaselineForSize:(CGSize)size
|
||||||
|
{
|
||||||
|
NSAttributedString *attributedText =
|
||||||
|
[self textStorageAndLayoutManagerThatFitsSize:size exclusiveOwnership:NO];
|
||||||
|
|
||||||
|
__block CGFloat maximumDescender = 0.0;
|
||||||
|
|
||||||
|
[attributedText enumerateAttribute:NSFontAttributeName
|
||||||
|
inRange:NSMakeRange(0, attributedText.length)
|
||||||
|
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
||||||
|
usingBlock:
|
||||||
|
^(UIFont *font, NSRange range, __unused BOOL *stop) {
|
||||||
|
if (maximumDescender > font.descender) {
|
||||||
|
maximumDescender = font.descender;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return size.height + maximumDescender;
|
||||||
|
}
|
||||||
|
|
||||||
static YGSize RCTTextShadowViewMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode)
|
static YGSize RCTTextShadowViewMeasure(YGNodeRef node, float width, YGMeasureMode widthMode, float height, YGMeasureMode heightMode)
|
||||||
{
|
{
|
||||||
CGSize maximumSize = (CGSize){
|
CGSize maximumSize = (CGSize){
|
||||||
|
@ -341,4 +363,18 @@ static YGSize RCTTextShadowViewMeasure(YGNodeRef node, float width, YGMeasureMod
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static float RCTTextShadowViewBaseline(YGNodeRef node, const float width, const float height)
|
||||||
|
{
|
||||||
|
RCTTextShadowView *shadowTextView = (__bridge RCTTextShadowView *)YGNodeGetContext(node);
|
||||||
|
|
||||||
|
CGSize size = (CGSize){
|
||||||
|
RCTCoreGraphicsFloatFromYogaFloat(width),
|
||||||
|
RCTCoreGraphicsFloatFromYogaFloat(height)
|
||||||
|
};
|
||||||
|
|
||||||
|
CGFloat lastBaseline = [shadowTextView lastBaselineForSize:size];
|
||||||
|
|
||||||
|
return RCTYogaFloatFromCoreGraphicsFloat(lastBaseline);
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in New Issue