0

我正在尝试实现一个自定义的“NSTextField”,它会在用户插入文本时自动调整自身大小。

这是一个足够简单的任务,这是我正在使用的代码:

- (void)textDidChange:(NSNotification *)aNotification
{
    [super textDidChange:aNotification];    
    [self invalidateIntrinsicContentSize];
}

- (NSSize)intrinsicContentSize
{
    if ( ![self.cell wraps] ) {
        return [super intrinsicContentSize];
    }
    NSRect frame = [self frame];
    CGFloat width = frame.size.width;
    frame.size.height = CGFLOAT_MAX;
    NSString *cellTitle = ((NSCell *)self.cell).title;
    CGFloat height = [self.cell cellSizeForBounds: frame].height;
    return NSMakeSize(width, height);
}

哪个工作。好奇的是,如果我评论调用NSTextField's 单元格标题的行

NSString *cellTitle = ((NSCell *)self.cell).title;

它停止工作。似乎该单元格在请求之前不会更新其标题。当然,如果单元格的标题没有改变,那么当用户输入文本时,文本字段就不能自行调整大小。

这种行为是功能还是错误?

正如我所说,上面的代码完成了这项工作,所以这更像是一种好奇心。唯一的烦恼是该行会产生警告,我想知道是否有更好的方法来做到这一点。

编辑:没关系,我发现如果我将行更改为[(NSCell *)self.cell title];编译器停止抱怨。尽管如此,对功能或错误的好奇心仍然存在。

4

1 回答 1

0

“返回接收视图的自然大小,仅考虑视图本身的属性。

  • (NSSize)内在内容大小

返回值 一个大小,指示接收视图基于其固有属性的自然大小。

讨论 自定义视图通常会显示布局系统不知道的内容。覆盖此方法允许自定义视图根据其内容与布局系统通信它想要的大小。这个固有尺寸必须独立于内容框架,因为没有办法根据改变的高度动态地将改变的宽度传达给布局系统”

所以当你打字的时候,你应该自己设置框架,如果你得到你输入的字符串的长度和字体,你可以得到字符串的高度也可以得到TextField的高度。但是有些字符你应该小心,比如'\n'。
于 2013-01-04T07:00:01.627 回答