Название 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]; компилятор перестает жаловаться. Любопытство о функции или ошибка все еще остается, хотя.

1 ответ

Msgstr "Возвращает натуральный размер для принимающего вида, учитывая только свойства самого вида.

  • (NSSize) intrinsicContentSize

Возвращаемое значение Размер, указывающий естественный размер для принимающего представления на основе его внутренних свойств.

Обсуждение Пользовательские представления обычно имеют контент, который они отображают, о котором система макетов не знает. Переопределение этого метода позволяет настраиваемому представлению сообщать системе макетов, какой размер он хотел бы основывать на своем содержимом. Этот внутренний размер должен быть независимым от фрейма контента, потому что нет способа динамически передавать измененную ширину в систему макетов на основе измененной высоты ".

Поэтому, когда вы печатаете, вы должны установить рамку самостоятельно, если вы получите длину введенной строки и шрифт, вы можете получить высоту строки и высоту TextField. но с каким-то персонажем вы должны быть осторожны, например '\n'.
Другие вопросы по тегам