2016-02-12 8 views
0

Кажется, commonlyaccepted что cellSizeForBounds: позволяет рассчитать «естественный» размер текстового поля. Тем не менее, для NSTextField, я обнаружил, что это не совсем соответствует:.NSTextFieldCell's cellSizeForBounds: не соответствует обертыванию?

@interface MyTextField : NSTextField @end 
@implementation MyTextField 
- (void)textDidChange:(NSNotification *)notification { 
    [super textDidChange:notification]; 
    [self validateEditing]; // Forces updating from the field editor 

    NSSize cellSize = [self.cell cellSizeForBounds: 
         NSMakeRect(0, 0, self.bounds.size.width, CGFLOAT_MAX)]; 
    NSRect frame = self.frame; 
    CGFloat heightDelta = cellSize.height - frame.size.height; 
    frame.size.height += heightDelta; 
    if (!self.superview.flipped) { frame.origin.y -= heightDelta; } 
    self.frame = frame; 
} 
@end 

(Обратите внимание, что я не использую Auto Layout, но принцип тот же эта проблема Безразлично 0)

Я подозреваю, что это связано с границей текстового поля, которая добавляет дополнительное смещение. Есть ли способ автоматически вычислить связь между cellSizeForBounds: и NSTextField's frame? Как еще я могу решить эту проблему?

ответ

1

Существует разница между размером ячейки и размером рамки. Лучший способ определить это - попросить текстовое поле самому размеру его содержимого, используя -sizeToFit, а затем сравнить его размер ячейки с ее размером кадра. Вы можете сделать это со вторичным текстовым полем вне экрана. Обязательно настройте все его параметры идентично текстовому полю, которое вы собираетесь изменять. Кроме того, размер ячейки будет «точной», что означает, что он будет иметь фракционную ширину или высоту. Размер кадра, полученный в результате -sizeToFit, будет интегральным. Таким образом, вы должны применить к компонентам размера ячейки перед сравнением с размером кадра, чтобы вычислить размер границы.

Теоретически, вы должны сделать это только один раз для заданной конфигурации/стиля текстового поля.

+0

Спасибо, Кен. Я надеялся, что будет какой-то более простой способ разобраться в различии, но я думаю, что это разумный подход. Для записи я обнаружил, что NSLayoutManager имеет '-usedRectForTextContainer:', который, кажется, точно представляет кадр NSTextView. Итак, я думаю, что в итоге я получу текстовое представление. – jtbandes

+0

Ну, даже для текстового вида есть 'textContainerInset', который вам нужно учитывать, но, по крайней мере, это явно. –

+0

Да, точно. (NSTextView также автоматически изменяет размер автоматически, но я сохраню его в виде прокрутки и изменяю размер прокрутки по мере необходимости, чтобы поддерживать максимальную высоту.) – jtbandes

 Смежные вопросы

  • Нет связанных вопросов^_^