私は次のメソッドを使用して一定の幅を与えNSAttributedString
の高さを測定しようとしています:NSLayoutManager/NSTextContainer無視スケールファクタ
-(CGFloat)calculateHeightForAttributedString:(NSAttributedString*)attributedNotes {
CGFloat scrollerWidth = [NSScroller scrollerWidthForControlSize:NSRegularControlSize scrollerStyle:NSScrollerStyleLegacy];
CGFloat width = self.tableView.frame.size.width - self.cellNotesWidthConstraint - scrollerWidth;
// http://www.cocoabuilder.com/archive/cocoa/54083-height-of-string-with-fixed-width-and-given-font.html
NSTextView *tv = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, width - 20, 1e7)];
tv.font = [NSFont userFontOfSize:32];
[tv.textStorage setAttributedString:attributedNotes];
[self setScaleFactor:[self convertSliderValueToFontScale:self.fontScaleSlider] forTextView:tv];
[tv.layoutManager glyphRangeForTextContainer:tv.textContainer];
[tv.layoutManager ensureLayoutForTextContainer:tv.textContainer];
return [tv.layoutManager usedRectForTextContainer:tv.textContainer].size.height + 10.0f; // add a little bit of a buffer
}
基本的には、幅がテーブルビューのサイズを引いスクロールと少しです他の情報を表示するために使用される各セルのビット。この方法は、テキストの尺度(convertSliderValueToFontScale:
経由)が1.0である限り、本当にうまく機能します。しかし、縮尺係数を変更すると、usedRectForTextContainer
の結果は正しくありません。縮尺係数が考慮されていないかのようです。次のように
スケールは(スカラーは、実際のスケール量である)NSTextViewにsetScaleFactor:forTextView:
に設定されている:
[textView scaleUnitSquareToSize:NSMakeSize(scaler, scaler)];
この問題を解決する方法上の任意のアイデアを?
編集:試してみるサンプルプロジェクトがあります:Github。不思議なことに、スケールは< 0であれば物事は仕事、そして彼らは、ランダム機会に4.XXX範囲で動作するようです...
、ローカル座標系内の点の数は同じままで次のよう
最終的な高さの関数です。 – Willeke
私はNSLayoutManager/NSTextContainerが** scaleUnitSquareToSize'について何か**知っていると思います。なぜなら、NSScrollViewが水平スクロールを無効にしていると仮定して、テキストが拡大されるにつれてテキストの折り返しが調整されるからです。 – Deadpikle
'[tv sizeToFit]'が役に立ちます。 – Willeke