2013-06-17 3 views
1

Есть ли способ автоматически изменить размер высоты из NSTokenField (поддерживая постоянную ширину) с использованием ограничений?Автоматическое изменение размера NSTokenField с основанием на основе ограничений

-sizeToFit должен работать, но это не так. Если я установил ограничение, чтобы сохранить константу ширины и вызывать этот метод, она игнорирует ограничения и изменяет только ширину (когда я хочу изменить только высоту).

ответ

0

основе How to let NSTextField grow with the text in auto layout?

Также не устанавливают контрсилами размера, только пусть это будет.

Метод intrinsicContentSize в NSView возвращает то, что сам взгляд считает его внутренним размером содержимого.

NSTextField рассчитывает это без учета свойства wraps его ячейки, поэтому он будет сообщать размеры текста, если он выложен на одной строке.

Следовательно, пользовательский подкласс NSTokenField может переопределить этот метод, чтобы вернуть лучшее значение, например, от предусмотренного метода клетки 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); 
} 
+0

не совсем, то cellSizeForBounds всегда возвращает один и тот же размер в tokenfield ... и вы должны слушать на textDidChange и invalidateIntrinsicContentSi ze –

+0

@PeterLapisu cellSizeForBounds не всегда возвращает одинаковый размер, по крайней мере, 10.11. Я отправил ответ с полным кодом. – rdougan

1

Метод маркеров поля cellSizeForBounds ли вернуть правильный размер, так что вы можете реализовать его, как это (пользовательский подкласс, в Swift):

class TagsTokenField: NSTokenField { 

    override func textDidChange(notification: NSNotification) { 
     super.textDidChange(notification) 
     self.invalidateIntrinsicContentSize() 
    } 

    override var intrinsicContentSize: NSSize { 
     let size = self.cell!.cellSizeForBounds(NSMakeRect(0, 0, self.bounds.size.width, 1000)) 
     return NSMakeSize(CGFloat(FLT_MAX), size.height) 
    } 

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