当用户调整窗口大小时,垂直调整NSTextField的大小

时间:2013-02-12 22:37:51

标签: macos cocoa nstextfield

我在窗口视图中有一个NSTextField。

我已尝试过所有IB选项,但我似乎无法实现以下目标:

NSTextField中有一个很长的句子 - 当Window调整为更窄的宽度时,NSTextField也会变窄 - 这会将文本推到下一行。但是,任何被推到NSTextField底部下方的文本都会被截断。我希望NSTextField能够垂直扩展其大小以适应更高的文本。

这可以自动完成,还是应该观察Window resize事件并重新计算NSTextField的高度?

我需要支持10.7和10.8并尝试使用Autolayout和Autoresizing,但无济于事。

编辑 - 这是根据Jerry的答案(以及他在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];
}

2 个答案:

答案 0 :(得分:2)

Autolayout的运营水平更高。我认为你需要调整文本字段的大小。

您可以尝试将-sizeToFit发送到文本字段,但这可能会水平扩展而不是垂直扩展。因此,如果这不起作用,请查看NS(Attributed)String+Geometrics category中的-heightForWidth ::方法。使用此方法,您可以继承NSTextField并覆盖-sizeToFit以垂直扩展。将调整大小合并到setFrame:和setStringValue中可能会很酷:因此它总是保持适当的高度。

Autolayout应该从那里接管,根据需要移动和调整兄弟子视图的大小。

答案 1 :(得分: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