前面已經說了的NSTextField,同時也是UITextField是非常不同的對象(相反的是他們的名字所暗示的)。具體而言,對於NSTextField,您可以使用一個涉及NSLayoutManager的優雅解決方案。 NSLayoutManager對象會協調NSTextStorage對象中保存的字符的佈局和顯示。它將Unicode字符代碼映射到字形,將字形設置在一系列NSTextContainer對象中,並將它們顯示在一系列NSTextView對象中。
所有你需要的是創建一個NSLayoutManager一個NSTextContainer和一個NSTextStorage。他們以類似的方式一起包裝所有:
.-----------------------.
| NSTextStorage |
| .-----------------. |
| | NSLayoutManager | |
| '-----------------' |
| | NSTextStorage | |
| '-----------------' |
| |
'-----------------------'
這就是說,你可以使用的layoutManager方法usedRectForTextContainer:
估計包含您想要的文字正確的尺寸。
下面應該爲你的問題的工作:
- (float)heightForStringDrawing:(NSString *)aString withFont:(NSFont *)aFont andWitdh:(float)myWidth
{
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:aString];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth,CGFLOAT_MAX)];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[layoutManager setTypesetterBehavior:NSTypesetterBehavior_10_2_WithCompatibility];
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];
[textStorage addAttribute:NSFontAttributeName value:aFont
range:NSMakeRange(0,[textStorage length])];
[textContainer setLineFragmentPadding:0.0];
NSRange glyphRange = [layoutManager glyphRangeForTextContainer:textContainer];
[layoutManager drawGlyphsForGlyphRange: glyphRange atPoint:NSMakePoint(0, 0)];
return [layoutManager usedRectForTextContainer:textContainer].size.height;
}
有關於這個主題的詳盡蘋果文檔:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html#//apple_ref/doc/uid/20001809-CJBGBIBB
此外,一些老兵解剖蘋果郵件列表的問題時間前:
http://lists.apple.com/archives/cocoa-dev/2006/Jan/msg01874.html
這是(我的意思是它的等價物)也適用於OS X嗎? –
應該是... –
好的,謝謝哥們!給我一分鐘檢查這一個出來,我會讓你知道... –