Базовый подход звучит хорошо.
У 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];
Надеюсь, это поможет.