NSCell标题在请求之前不会更新

时间:2013-01-04 04:43:22

标签: macos cocoa nstextfield nscell

我正在尝试实现一个自定义的“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的单元格标题的行

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

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

此行为是功能还是错误?

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

编辑:没关系我想出如果我将行更改为[(NSCell *)self.cell title];,编译器会停止抱怨。关于功能或bug的好奇心仍然存在。

1 个答案:

答案 0 :(得分:0)

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

  • (NSSize)intrinsicContentSize

返回值 一个大小,根据其内在属性指示接收视图的自然大小。

讨论 自定义视图通常具有显示布局系统不知道的内容。覆盖此方法允许自定义视图根据其内容与布局系统进行通信。此内在大小必须独立于内容框架,因为无法根据更改的高度动态地将更改的宽度传达给布局系统“

因此,当您键入时,您应该自己设置框架,如果您获得所键入的字符串的长度,并且字体,您可以获得字符串的高度以及TextField的高度。但是你应该小心一些角色,比如'\ n'。