Как сохранить последний элемент дерева NSOutlineView в самой нижней части боковой панели? - PullRequest
5 голосов
/ 25 августа 2009

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

Журнал и мусорные пункты находятся в самом низу http://tinyurl.com/lhctza

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

Мне кажется, что специальный элемент дерева "spacer" следует использовать вместе с методом outlineView:heightOfRowByItem:.

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

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

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

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

1 голос
/ 01 ноября 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);
}

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

...