3

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

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

NSTextField 中有一个很长的句子——当窗口被调整为更窄的宽度时,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];
}
4

2 回答 2

2

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

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

自动布局应该从那里接管,根据需要移动和调整同级子视图的大小。

于 2013-02-13T16:34:44.240 回答
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
于 2015-07-27T13:34:44.427 回答