Автоматическое изменение размера NSTokenField с макетом на основе ограничений

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

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


person Alex    schedule 17.06.2013    source источник


Ответы (2)


На основе Как позволить NSTextField расти вместе с текстом в автоматическом макете?

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

Метод 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);
}
person aryeh    schedule 09.05.2014
comment
не совсем, cellSizeForBounds всегда возвращает один и тот же размер в tokenfield... также вам нужно слушать textDidChange и invalidateIntrinsicContentSize - person Peter Lapisu; 04.10.2014
comment
@PeterLapisu cellSizeForBounds не всегда возвращает один и тот же размер, по крайней мере, 10.11.2018. Я отправил ответ с полным кодом. - person rdougan; 20.09.2015

Метод 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)
    }

}
person rdougan    schedule 20.09.2015