2012-10-22 79 views
3

好吧,這裏是我的情況:變化的NSTextField的高度

  • 我有一個NSTextField,設置爲多行文本標籤
  • NSTextField應該只能持有一行文本(即使是多行文本)
  • NSTextField有一個固定高度
  • 字體字體大小由用戶

問題改變了:

  • 根據所使用的字體,大小,文字的底部失蹤(因爲它超出了NSTextField的界限

我想要什麼:

  • 獲取文字高度的基礎上,選擇(字體&字體大小),並設置相應的NSTextField的高度。

我知道這聽起來很複雜,但我也知道它可以做到的。

任何想法?任何參考指向我?

回答

-2

你可以把字符串的大小,然後更改高度相應

NSString *text = // your string 
CGSize constraint = CGSizeMake(210, 20000.0f); 
CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Helvetica-Light" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 

UITextField *cellTextLabel = [[UITextField alloc] initWithFrame:CGRectMake(70, 9, 230, size.height)]; 
cellTextLabel.lineBreakMode = UILineBreakModeWordWrap; 
cellTextLabel.numberOfLines = 50; 
cellTextLabel.backgroundColor = [UIColor clearColor]; 
cellTextLabel.text = text; 
cellTextLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:14]; 
[self.view addSubview:cellTextLabel]; 
[cellTextLabel release]; 
+0

這是(我的意思是它的等價物)也適用於OS X嗎? –

+0

應該是... –

+0

好的,謝謝哥們!給我一分鐘檢查這一個出來,我會讓你知道... –

4

前面已經說了的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