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

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

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

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

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

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

2 ответа

Решение

Я решил жестко закодировать решение, добавив 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);
}

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

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

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

Другие вопросы по тегам