CTFramesetterSuggestFrameSizeWithConstraints不会将结果限制为约束大小

时间:2012-05-21 13:28:11

标签: core-text

我使用CTFramesetterSuggestFrameSizeWithConstraints函数来定义我的属性字符串所需的大小,但是我获得的高度小于它应该的高度,并且宽度也大于constrainSize.width参数。这是我的代码:

CTTextAlignment textAlignment = kCTLeftTextAlignment;
CTLineBreakMode lineBreakMode = kCTLineBreakByWordWrapping;

CTParagraphStyleSetting paragraphSettings[] = {
    {
        kCTParagraphStyleSpecifierAlignment,
        sizeof(textAlignment),
        &textAlignment
    },
    {
        kCTParagraphStyleSpecifierLineBreakMode,
        sizeof(lineBreakMode),
        &lineBreakMode
    }  
};

CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(paragraphSettings, sizeof(paragraphSettings) / sizeof(paragraphSettings[0]));

NSMutableAttributedString *attrString = [[[NSMutableAttributedString alloc] initWithString:[authorString stringByAppendingFormat:@" %@", bodyText]] autorelease];

CTFontRef ctfontAuthor = CTFontCreateWithName((CFStringRef)@"Arial-BoldMT", 14.0, NULL);
CTFontRef ctfontBody = CTFontCreateWithName((CFStringRef)@"Arial", 14.0, NULL);
[attrString addAttribute:(NSString *)kCTParagraphStyleAttributeName value:(id)paragraphStyle range:NSMakeRange(0, [attrString length])];
[attrString addAttribute:(NSString *)kCTFontAttributeName value:(id)ctfontAuthor range:NSMakeRange(0, [authorString length] + 1)];
[attrString addAttribute:(NSString *)kCTFontAttributeName value:(id)ctfontBody range:NSMakeRange([authorString length] + 1, [bodyText length])];
CFRelease(ctfontAuthor);
CFRelease(ctfontBody);
CFRelease(paragraphStyle);

CFRange fitRange;
CGSize result = CGSizeZero;
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFMutableAttributedStringRef)attrString);
result = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [authorString length] + [bodyText length] + 1), NULL, size, &fitRange);
CFRelease(framesetter);
return result;// result is the value I need to be constrained to size (229.0, MAXFLOAT) but sometimes it is 231 and some more

我做错了什么?

3 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我从this post找到了解决方案(至少对于身高问题)。您需要指定kCTParagraphStyleSpecifierLineSpacingAdjustment。

答案 1 :(得分:0)

在返回结果大小之前,尝试将result.width参数设置为约束大小的宽度。

答案 2 :(得分:0)

我也在这种情况下运行,解决了它并编写了一个类别,在所有情况下都适用于我。请参阅我的答案如果您使用零作为高度,它不会将高度限制为任何高度。我为这个问题写了一个类别,在所有情况下都适用于我。见iOS UITableView with dynamic text and images rendered together (NSAttributedString + images)