2016-08-22 7 views
0

私は次のメソッドを使用して一定の幅を与え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範囲で動作するようです...

+0

、ローカル座標系内の点の数は同じままで次のよう

最終的な高さの関数です。 – Willeke

+0

私はNSLayoutManager/NSTextContainerが** scaleUnitSquareToSize'について何か**知っていると思います。なぜなら、NSScrollViewが水平スクロールを無効にしていると仮定して、テキストが拡大されるにつれてテキストの折り返しが調整されるからです。 – Deadpikle

+0

'[tv sizeToFit]'が役に立ちます。 – Willeke

答えて

0

答えは簡単であることが判明:NSClipViewのサブビューとしてNSTextViewを追加NSTextViewと同じフレームです。私はそれを見るように、 `scaleUnitSquareToSize`ポイントのサイズを変更

-(CGFloat)calculateHeightForAttributedString:(NSAttributedString*)attributedNotes { 
    CGFloat width = self.textView.frame.size.width; 
    // 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, 1e7)]; 
    tv.horizontallyResizable = NO; 
    tv.font = [NSFont userFontOfSize:32]; 
    tv.alignment = NSTextAlignmentLeft; 
    [tv.textStorage setAttributedString:attributedNotes]; 
    [self setScaleFactor:self.slider.floatValue forTextView:tv]; 

    // In order for usedRectForTextContainer: to be accurate with a scale, you MUST 
    // set the NSTextView as a subview of an NSClipView! 
    NSClipView *clipView = [[NSClipView alloc] initWithFrame:NSMakeRect(0, 0, width, 1e7)]; 
    [clipView addSubview:tv]; 

    [tv.layoutManager glyphRangeForTextContainer:tv.textContainer]; 
    [tv.layoutManager ensureLayoutForTextContainer:tv.textContainer]; 
    return [tv.layoutManager usedRectForTextContainer:tv.textContainer].size.height; 
}