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

Macos 当用户调整窗口大小时,垂直调整NSTextField的大小,macos,cocoa,nstextfield,Macos,Cocoa,Nstextfield,我在窗口视图中有一个NSTextField 我尝试了所有IB选项,但似乎无法实现以下目标: NSTextField中有一个很长的句子-当窗口调整到较窄的宽度时,NSTextField也会变窄-这会将文本推到下一行。但是,任何推到NSTEXT字段底部以下的文本都会被简单地切断。我希望NSTextField垂直扩展其大小,以容纳较高的文本 这可以自动完成吗?或者我应该观察窗口大小调整事件并重新计算NSTextField的高度吗 我需要支持10.7和10.8,我尝试过使用自动布局和自动调整大小,但都没

我在窗口视图中有一个NSTextField

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

NSTextField中有一个很长的句子-当窗口调整到较窄的宽度时,NSTextField也会变窄-这会将文本推到下一行。但是,任何推到NSTEXT字段底部以下的文本都会被简单地切断。我希望NSTextField垂直扩展其大小,以容纳较高的文本

这可以自动完成吗?或者我应该观察窗口大小调整事件并重新计算NSTextField的高度吗

我需要支持10.7和10.8,我尝试过使用自动布局和自动调整大小,但都没有用

编辑-这是基于Jerry的答案(以及他在Github的分类)的代码:


Autolayout在更高级别上运行。我认为您需要调整文本字段的大小

您可以尝试将-sizeToFit发送到文本字段,但这可能会水平扩展而不是垂直扩展。因此,如果这不起作用,请查看我的示例中的-heightForWidth::方法。使用此方法,可以将NSTextField子类化并重写-sizeToFit以垂直展开。将调整大小合并到setFrame:和setStringValue:中可能会很酷,这样它将始终保持适当的高度


Autolayout应从此处接管,根据需要移动和调整同级子视图的大小。

使用此子类在宽度更改时扩展高度:

@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

您可能会在这里找到一些有用的信息:感谢Monolo-实际上更好地使用Jerry的类别和-(NSSize)intrinsicContentSize,因为我不需要显式设置框架,因此它保持了自动布局的有序性。生活是美好的。是的,这很有效——谢谢杰瑞。我做了NSTextField子类并重写了setFrame:我需要对此稍加改进,但概念的证明就在那里——谢谢——谢谢你的分类以及计算高度的分类。我在上面添加了一些细节
@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