我正在尝试将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)来攻击它,但我想以正确的方式做到这一点。
答案 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)