weex <text>组件的高度不正确吗?

时间:2018-12-24 08:33:31

标签: ios weex

当前的WeexSDK版本0.18.0,我在模拟器和真实机器上使用显示类似的效果,并且文本无法完全显示,如下所示。

我还添加了脚本来演示如何完成源代码中文本组件的高度计算。 suggestSize.height始终是我想要的高度,但是此代码仅在iOS10下执行。当文本行多于iOS10时,totalHeight的值总是更差。我该如何解决?

效果如下:

screen shot

源代码:

- (CGSize)calculateTextHeightWithWidth:(CGFloat)aWidth
{

   CGFloat totalHeight = 0;
CGSize suggestSize = CGSizeZero;
NSAttributedString * attributedStringCpy = [self ctAttributedString];
if (!attributedStringCpy) {
    return CGSizeZero;
}
if (isnan(aWidth)) {
    aWidth = CGFLOAT_MAX;
}
aWidth = [attributedStringCpy boundingRectWithSize:CGSizeMake(aWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil].size.width;

/* Must get ceil of aWidth. Or core text may not return correct bounds.
 Maybe aWidth without ceiling triggered some critical conditions. */
aWidth = ceil(aWidth);
CTFramesetterRef ctframesetterRef = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(attributedStringCpy));
suggestSize = CTFramesetterSuggestFrameSizeWithConstraints(ctframesetterRef, CFRangeMake(0, 0), NULL, CGSizeMake(aWidth, MAXFLOAT), NULL);

if (_lines == 0) {
    // If not line limit use suggestSize directly.
    CFRelease(ctframesetterRef);
    return CGSizeMake(aWidth, suggestSize.height);
}

CGMutablePathRef path = NULL;
path = CGPathCreateMutable();
    // sufficient height to draw text
CGPathAddRect(path, NULL, CGRectMake(0, 0, aWidth, suggestSize.height * 10));

CTFrameRef frameRef = NULL;
frameRef = CTFramesetterCreateFrame(ctframesetterRef, CFRangeMake(0, attributedStringCpy.length), path, NULL);
CGPathRelease(path);
CFRelease(ctframesetterRef);

if (NULL == frameRef) {
    //try to protect unexpected crash.
    return suggestSize;
}

CFArrayRef lines = CTFrameGetLines(frameRef);
CFIndex lineCount = CFArrayGetCount(lines);
CGFloat ascent = 0;
CGFloat descent = 0;
CGFloat leading = 0;

// height = ascent + descent + lineCount*leading
// ignore linespaing
NSUInteger actualLineCount = 0;
for (CFIndex lineIndex = 0; (!_lines|| lineIndex < _lines) && lineIndex < lineCount; lineIndex ++)
{
    CTLineRef lineRef = NULL;
    lineRef = (CTLineRef)CFArrayGetValueAtIndex(lines, lineIndex);
    CTLineGetTypographicBounds(lineRef, &ascent, &descent, &leading);
    totalHeight += ascent + descent;
    actualLineCount ++;
}

totalHeight = totalHeight + actualLineCount * leading;
CFRelease(frameRef);

if (WX_SYS_VERSION_LESS_THAN(@"10.0")) {
    // there is something wrong with coreText drawing text height, trying to fix this with more efficent way.
    if(actualLineCount && actualLineCount < lineCount) {
        suggestSize.height = suggestSize.height * actualLineCount / lineCount;
    }
    return CGSizeMake(aWidth, suggestSize.height);
}
return CGSizeMake(aWidth, totalHeight);
}

0 个答案:

没有答案