Использование Core Animation / CALayer для простой многоуровневой рисования - PullRequest
1 голос
/ 30 июля 2009

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

Уместно ли использовать классы Core Animation, такие как CALayer, для этой задачи, хотя я не ожидаю, что анимация понадобится? Есть ли более подходящий подход?

Чтобы уточнить, представление не должно походить на холст в приложении, подобном Photoshop. Это больше дисплей данных, который должен учитывать взаимодействие с пользователем (выбор, перемещение, прокрутка и т. Д.)

Ответы [ 2 ]

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

Если вам нужен дисплей и макет, я бы сказал, что архитектура на основе CALayer - хороший выбор. Для открытой основы Core Plot Framework мы строим все наши графики и элементы графика из CALayers и организуем их в регулярной иерархии. CALayers легки и используют практически идентичные API-интерфейсы между Mac и iPhone. Их даже можно заставить реагировать на события касания или мыши.

Для другого примера пользовательского интерфейса на основе CALayer, моего приложения для iPhone * Весь интерфейс ввода уравнений состоит из CALayers, включая меню, которое выдвигается снизу вверх. Производительность немного лучше, чем в моей предыдущей реализации на основе UIView, но этот же код работает и в моей предварительной версии приложения для настольных компьютеров.

2 голосов
/ 30 июля 2009

Я бы подумал, что для программы рисования было бы важно сохранить буфер растровых данных. Единственная проблема с использованием CALayer заключается в том, что свойство contents является CGImageRef. Превратить это обратно в графический контекст для дальнейшего рисования может быть немного болезненно. Вам нужно будет инициализировать новый контекст, нарисовать растровые данные в нем, затем выполнить любые операции рисования, которые вы хотите сделать, и, наконец, превратить это обратно в CGImageRef. Вы, вероятно, не сможете избежать большого количества выделения памяти, которое практически гарантированно замедлит работу вашей программы.

Я хотел бы рассмотреть возможность хранения вне экрана буфера для каждого слоя. Посмотрите на объект Quartz CGLayerRef. Я думаю, что это, вероятно, делает то, что вы хотите сделать: это внеэкранный буфер, в котором хранятся вещи, которые вы, возможно, захотите рисовать повторно. Вы также можете быстро получить CGContextRef, когда вам это нужно, чтобы вы могли сделать дополнительный рисунок. И вы всегда можете использовать это CGContextRef с NSGraphicsContext, если хотите использовать методы рисования Какао.

...