1

CTFramesetterSuggestFrameSizeWithConstraints()をtableview:heightOfRow:で使用しようとしていますが、NSTableViewのセルの属性を使用して属性付きの文字列を入力しています。問題は、予想される14.0の倍数([tableView rowHeight]に対応)ではなく、13.0の倍数(1行の場合は13.0、2行の場合は26.0など)で値を返すことです。

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;

何かアドバイスをいただければ幸いです。現在、1行あたり1ポイント(13.0)の増加をハードコーディングすることでハッキングしていますが、これを正しい方法で実行したいと思います。

4

1 に答える 1

1

私は同様の問題に遭遇し、制約 rect を微調整することで、希望する出力を得ることができることがわかりました。

私の場合:

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)

于 2012-12-13T08:47:54.613 に答える