Как сохранить последний элемент дерева NSOutlineView в самом низу боковой панели?

Я хотел бы иметь такое же поведение специальных предметов, как это сделано в приложении Вещи. Я имею в виду элементы Журнал и Корзина в нижней части боковой панели:

http://tinyurl.com/lhctza

Посоветуйте, пожалуйста, как реализовать ту же функциональность в дереве боковой панели.

Я считаю, что вместе с методом outlineView:heightOfRowByItem: следует использовать специальный элемент дерева «спейсер».

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


person Vadim    schedule 25.08.2009    source источник


Ответы (2)


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

Сложная часть была бы сделать эту игру красивой с прокруткой, но я думаю, что вы могли бы это сделать. Я предполагаю, что вы бы поместили их обоих в NSView с полностью изменяемым размером и сделали бы это представление документа прокрутки.

person Peter Hosey    schedule 25.08.2009
comment
+1. Я видел другие списки (например, элемент «Параметры входа» в предварительной панели «Учетные записи»), воспроизведенные таким образом. - person iKenndac; 25.08.2009
comment
Однако вы также должны управлять не только состояниями прокрутки и 2 представлениями, но и уровнем отступа, следующими ответчиками, некоторыми горячими клавишами и т. д. Вопрос все еще открыт :) - person Vadim; 25.08.2009
comment
Уровень отступа не должен меняться, если это элементы верхнего уровня. Тем не менее, хороший момент о цепочке респондентов. - person Peter Hosey; 26.08.2009
comment
Учитывая уровни отступов. Пожалуйста, взгляните на элемент «Музыкальные видео» до и после добавления новой записи в папку «тест»: bit.ly/ 1U5gkL - person Vadim; 26.08.2009

Я решил жестко закодировать решение, добавив 8 пикселей высоты для каждого корневого элемента в групповом стиле. Итак, код выглядит так:

- (CGFloat)outlineView:(NSOutlineView *)ov heightOfRowByItem:(id)item;
{
    if (![item isSpacer]) return [ov rowHeight];

    static const CGFloat ADDITIONAL_SPACE = 8.0f;
    NSUInteger numberOfRootGroups = 2;
    CGFloat heightOfRows = [ov rowHeight] * ([ov rowForItem:item] + 1) 
        + ADDITIONAL_SPACE * numberOfRootGroups;
    CGFloat heightOfSidebar = [[ov superview] frame].size.height;
    return MAX(0.0f, heightOfSidebar - heightOfRows);
}

Спасибо всем за поддержку!

person Vadim    schedule 01.11.2009