15

現在の幅に応じて、テキスト フィールド/ビューのサイズを自動的に変更しようとしています。言い換えれば、幅を一定に保ちたいのですが、指定されたテキストに従って高さのサイズを変更します。

動作しているように見えますが、手動でウィンドウを元に戻そうとしても、何らかの理由でウィンドウの下部に位置合わせされています。ここで私が間違っていることを誰かが見ることができますか?

ここに画像の説明を入力

NSString *temp = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est, facilisis a feugiat in, consectetur eget arcu. Aenean rutrum, lacus id euismod congue, nisl erat vulputate lectus, non faucibus tortor purus sed sem. Donec tempor dui egestas velit auctor vitae faucibus diam facilisis. Morbi convallis nulla quis est pulvinar quis ultricies sem sollicitudin.";

myText.stringValue = temp;

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSFont systemFontOfSize:12], NSFontAttributeName,
                            [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName,
                            nil];

NSSize size = NSMakeSize(window.frame.size.width, 200);
myText.frame = [temp boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];

編集:フレームを手動で移動しても、テキストがまだ途切れていることは明らかです。新しく調整されたサイズは、まだ十分ではありません。 ここに画像の説明を入力

これは次を参照しています: NSString boundingRectWithSize は正しい幅をわずかに過小評価しています - なぜですか? および NSTextView または NSTextField は自動的に境界/フレームのサイズを変更しますか?

4

4 に答える 4

25

私は同じ問題を抱えていました。私はドキュメンテーションで次のことを見つけました:

複数行のテキストを正しく描画してサイズを変更するには、options パラメーターで NSStringDrawingUsesLineFragmentOrigin を渡します。

このメソッドは、(返された CGRect のサイズ コンポーネントで) 分数のサイズを返します。返されたサイズをビューのサイズに使用するには、ceil 関数を使用してその値を最も近い整数に上げる必要があります。

だからこれは私のためにそれを解決しました:

CGRect rect = [myLabel.text boundingRectWithSize:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)
                                                            options:NSStringDrawingUsesLineFragmentOrigin
                                                            attributes:@{NSFontAttributeName: myLabel.font}
                                                            context:nil];
rect.size.width = ceil(rect.size.width);
rect.size.height = ceil(rect.size.height);

更新 (スイフト 5.1)

これを行う別の Swift の方法は次のとおりです。

let size = myLabel.text!.size(
    withAttributes: [.font: myLabel.font!]
)
let rect = CGSize(
  width: ceil(size.width),
  height: ceil(size.height)
)

Objective-C の例については、この回答を参照してください。

于 2014-05-09T11:11:02.853 に答える
2

少し回り道ですが、クエリを実行すると、NSTextFieldCellを使用するよりもはるかに正確で信頼性の高い高さの結果が得られることがわかりました[NSAttributedString boundingRectWithSize:options:]

対象の文字列が適切な書式設定/折り返しオプションが設定されたNSTextFieldにすでに存在すると仮定して、指定された幅に収まる必要があると思われるサイズについてテキストセルにクエリを実行します。

NSTextField* textField = ...

NSSize cellSize = [textField.cell cellSizeForBounds:NSMakeRect(0, 0, pathText.frame.size.width, CGFLOAT_MAX)];

cellSize.height描画時にテキストが実際に使用する高さを示します。

于 2012-11-07T01:31:46.593 に答える
1

これは私が最終的に行ったものです(少なくとも当面は)うまくいくようですが、これを達成するためのより良い方法があるように感じます.

NSString *temp = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vel felis nec massa ultricies blandit non id arcu. Sed enim est.";

myText.stringValue = temp;

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSFont systemFontOfSize:12], NSFontAttributeName,
                            [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName,
                            nil];

NSSize size = NSMakeSize(window.frame.size.width, MAXFLOAT);


myText.frame = [temp boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];

// Keep current width but add some more on the bottom
NSSize tF = myText.frame.size;
[myText setFrameSize:NSMakeSize(tF.width, tF.height + 35)];

[myText setFrameOrigin:NSMakePoint((NSWidth(window.frame) - NSWidth(myText.frame)) / 2, 
                                   (NSHeight(window.frame) -  NSHeight(myText.frame) - 20))];

[myText setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin];

これを生成します:

ここに画像の説明を入力

于 2012-08-23T23:27:50.800 に答える