2013-02-12 73 views
3

我在窗口視圖中有一個NSTextField。當用戶調整窗口大小時,垂直調整NSTextField的大小

我已經嘗試了所有IB選擇,但我似乎無法實現以下目標:

有一個相當長的句子中的NSTextField - 當窗口調整爲窄寬度的NSTextField也越走越窄 - 將文本推送到下一行。然而,任何被壓入NSTextField底部的文本都會被截斷。我希望NSTextField垂直擴展其大小以適應更高的文本。

這可以自動完成還是應該觀察窗口大小調整事件並重新計算NSTextField的高度?

我需要支持10.7和10.8,我嘗試過使用Autolayout和Autoresizing,但無濟於事。

編輯 - 這是奮力基於傑裏的回答(和他從GitHub類)的代碼:在更高層次上

-(void)setFrame:(NSRect)frameRect{ 

    NSRect myFrame = CGRectMake(frameRect.origin.x, frameRect.origin.y, frameRect.size.width, [self.stringValue heightForWidth:frameRect.size.width attributes:nil]); 
    [super setFrame: myFrame]; 
} 
+1

你可能會在這裏找到一些有用的信息:http://stackoverflow.com/questions/10463680/how-to-let-nstextfield-grow-自動佈局文本 – Monolo 2013-02-13 17:09:46

+0

感謝Monolo - 實際上使用Jerry的類別與 - (NSSize)intrinsicContentSize相結合更好,因爲我不需要明確設置框架,因此它可以按順序保持Auto Layout。生活很好。 – petenelson 2013-02-15 12:17:37

回答

2

自動佈局操作。我認爲你需要調整文本字段的大小。

您可以嘗試將-sizeToFit發送到文本字段,但這可能會水平擴展而不是垂直擴展。所以,如果這不起作用,請查看我的NS(Attributed)String+Geometrics category中的-heightForWidth ::方法。使用此方法,您可以繼承NSTextField並覆蓋-sizeToFit以垂直展開。將調整大小併入setFrame:和setStringValue中可能會很酷:因此它始終保持適當的高度。

Autolayout應該從那裏接管,根據需要移動和調整兄弟子視圖的大小。

+0

是的,這是有效的 - 謝謝傑裏。我做了NSTextField子類,並覆蓋了setFrame:我需要對這一點進行磨練,但概念證明就在那裏 - 謝謝 - 並感謝您的類別以及計算高度。我已經在上面添加了一些細節 – petenelson 2013-02-13 17:15:11

0

使用此子類擴大寬度變化高度:

@interface MyTextField : NSTextField 

@property (nonatomic, assign) BOOL insideDeepCall; 

@end 

@implementation MyTextField 

- (void)layout 
{ 
    [super layout]; 

    if (!self.insideDeepCall) { 
    self.insideDeepCall = YES; 
    self.preferredMaxLayoutWidth = self.frame.size.width-4; 
    [self.superview layout]; 
    self.insideDeepCall = NO; 
    } 
} 

@end