Как сохранить последний элемент дерева 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 и сделаете его представлением документа в виде прокрутки.