Метод intrinsicContentSize
в NSView
возвращает то, что сам взгляд рассматривает как его собственный размер содержимого.
NSTextField
рассчитывает это без учета свойства wraps
его ячейки, поэтому он будет сообщать размеры текста, если он выложен на одной строке.
Следовательно, пользовательский подкласс NSTextField
может переопределить этот метод, чтобы вернуть лучшее значение, например, от предусмотренного методом клетки cellSizeForBounds:
:
-(NSSize)intrinsicContentSize
{
if (![self.cell wraps]) {
return [super intrinsicContentSize];
}
NSRect frame = [self frame];
CGFloat width = frame.size.width;
// Make the frame very high, while keeping the width
frame.size.height = CGFLOAT_MAX;
// Calculate new height within the frame
// with practically infinite height.
CGFloat height = [self.cell cellSizeForBounds: frame].height;
return NSMakeSize(width, height);
}
// you need to invalidate the layout on text change, else it wouldn't grow by changing the text
- (void)textDidChange:(NSNotification *)notification
{
[super textDidChange:notification];
[self invalidateIntrinsicContentSize];
}
Это точно соответствует тому, что я вижу. Чтобы прояснить, это игнорирование свойства «обертывания» в ячейке кажется ошибкой в Lion, которая была зафиксирована в Mountain Lion. Итак, если вы ориентируетесь на Lion и выше, вы увидите разные результаты в двух операционных системах, пока не примените исправление, чтобы привести Lion к скорости. –
Да, это ошибка во Льве. Я действительно хочу, чтобы Apple исправила эти проблемы как в OS X 10.7 && 10.8. В моей реализации я делаю еще несколько проверок для особых случаев (например, если это Lion || Если язык не является английским), и я устанавливаю свою высоту немного иначе. Тем не менее, то, что опубликовал Моноло, - хорошее начало. – Arvin
Метод intrinsicContentSize: не вызывается при изменении текста в нем с помощью setStringValue :. – ideawu