表视图中每行CTFramesetterSuggestFrameSizeWithConstraints()偏移1点

时间:2012-09-04 02:30:22

标签: macos nstableview

我正在尝试将CTFramesetterSuggestFrameSizeWithConstraints()与tableview:heightOfRow:一起使用,使用NSTableView的单元格属性输入属性字符串。问题是它返回的值是13.0的倍数(1行13.0,两行26.0等)而不是14.0的预期倍数(对应于[tableView rowHeight]。

NSDictionary * attributes = [[[[[tableView tableColumnWithIdentifier: @"Message"] dataCell] attributedStringValue]
                attributesAtIndex: 0 effectiveRange: NULL] retain];
NSAttributedString * attributedMessage = [[NSAttributedString alloc] initWithString: message attributes: attributes];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributedMessage);

CFRange range;
CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [attributedMessage length]), NULL, CGSizeMake([column width], CGFLOAT_MAX), &range);
CFRelease(framesetter);
[attributedMessage release];
return size.height;

任何建议都将不胜感激。现在我通过硬编码每行增加一个点(13.0)来攻击它,但我想以正确的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,发现通过调整约束矩形我可以得到我想要的输出。

就我而言:

CGSize s1 = CTFramesetterSuggestFrameSizeWithConstraints(self.framesetter, rangeToSize, NULL, CGSizeMake(size.width, CGFLOAT_MAX), NULL);
CGSize s2 = CTFramesetterSuggestFrameSizeWithConstraints(self.framesetter, rangeToSize, NULL, CGSizeMake(size.width, 100000), NULL);

s1最终为{100, 23}s2最终为{100, 24}(WTF?!)。

尝试将CGSizeMake([column width], CGFLOAT_MAX)替换为CGSizeMake([column width], 10000)