Как реализовать пользовательский элемент управления временной шкалой с какао? - PullRequest
2 голосов
/ 31 октября 2011

Мое приложение Cocoa собирает события (экземпляры NSManagedObject), которые необходимо отобразить на временной шкале.Мой первоначальный подход состоял в том, чтобы использовать существующий виджет на основе Javascript (я пытался использовать Simile Timeline и Timeglider) и отображать временную шкалу с помощью элемента управления WebView.Это работает в принципе, однако, к сожалению, оба этих виджета не очень хорошо обрабатывают даты BC, что является важным требованием для моего приложения.

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

После отказа от подхода Javascript у меня остается возможность отображать временную шкалу с помощью пользовательского элемента управления Какао.Поскольку я не нашел ничего подходящего, мне придется разработать его самому.

Это был бы мой первый пользовательский элемент управления Cocoa, и, подумав некоторое время об этом, я придумал следующий грубый дизайн:

  • Мне нужен пользовательский элемент управления для отображения фактической временной шкалы.Этот элемент управления, вероятно, основан на NSView.Этот элемент управления должен рассчитывать его размер на основе количества меток на временной шкале, умноженного на ширину (в пикселях) между каждой меткой.Например, временная шкала состоит из веков, каждый век шириной 100 пикселей.Временная линия событий между 10.000BC и 5.000BC тогда будет иметь ширину 5000 пикселей (10000 - 5000 = 5000 лет, что соответствует 50 векам).

  • Мне нужен ScrollView для переноса временной шкалычтобы позволить ему поддерживать поведение прокрутки.Нужна только горизонтальная прокрутка.

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

  • Мне нужен пользовательский элемент управления для отображения метки навременная шкала.

Принимая это за базовый дизайн для моего компонента временной шкалы в Какао, это сработает или я полностью упускаю суть?

1 Ответ

1 голос
/ 31 октября 2011

Базовый подход звучит хорошо.

У Apple есть хороший пример создания собственного NSView под названием «TreeView».Это хороший пример для понимания.

https://developer.apple.com/library/mac/#samplecode/TreeView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010131

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

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

Некоторые мысли:

Для чего-то такого, нарисованного пользователем, вы захотите переопределить drawRect, чтобы рисовать ваши линии и размещать ваши субконтроли.

Если вы рисуете свой фон или какую-либо часть видов, убедитесь, что вы включили представления с поддержкой слоев:

[self setWantsLayer:YES];

Если вы можете, как вы заметили, попробуйте использовать существующие элементы управления, которые вы добавилии макет.В моих пользовательских элементах управления я поддерживал структуры данных независимо от представлений / элементов управления, которые представляли состояние всех объектов.В drawRect я обнаружил изменение представления и вызвал функцию layoutSubviews.Моя функция layoutSubViews будет выполнять математику из моих структур данных и создавать или перемещать фрейм существующих элементов управления.Это хорошо работает для изменения размера и увеличения.Если вы увеличите масштаб, рекламные маркеры ваших ярлыков должны будут хорошо реагировать на то, что их масштабирование действительно очень маленькое - возможно, текст выпадает в какой-то момент и т. Д.

if ([self dataSource] && 
    !NSEqualRects(_prevRect, [self bounds]))
{
    // layoutViews is my custom function that worked over the data structures
    // and moved the frame
    [self layoutViews];
}

_prevRect = [self bounds];

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...