2013-02-12 61 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 
相关问题