Лучший способ реализовать функции рисования, такие как Keynote - PullRequest
6 голосов
/ 10 мая 2010

Я пытаюсь сделать небольшой инструмент iPad для рисования простых геометрических объектов (прямоугольник, прямоугольник с закругленными углами, эллипс, звезда, ...). Моя цель - сделать что-то очень близкое к Keynote (функция рисования), т.е. позволить пользователю добавить прямоугольник (например), изменить его размер и переместить. Я тоже хочу, чтобы пользователь мог выбирать много объектов и перемещать их вместе.

Я думал как минимум о трех разных способах сделать это:

  • Расширяет UIView для каждого типа объекта, класс для Rect, другой для Ellipse, ... С пользовательским методом рисования. Затем добавьте это представление как подпредставление глобального представления.
  • Расширяет CALayer для каждого типа объекта, класс для Rect, другой для Ellipse, ... С пользовательским методом рисования. Затем добавьте этот слой в качестве подслоя слоя глобального вида.
  • Расширяет NSObject для каждого типа объекта, класс для Rect, другой для Ellipse, ... всего лишь с помощью метода рисования, который получает в качестве аргумента CGContext и Rect и рисует непосредственно форму в нем. Эти методы будут вызываться методом рисования глобального представления.

Я знаю, что двумя первыми способами являются функции, позволяющие обнаруживать прикосновения к каждому объекту, легко добавлять тени ... но я боюсь, что они слишком тяжелые? Вот почему я подумал о последнем пути, который кажется прямым.

Какой путь будет более эффективным ??? А может я не думал иначе?

Любая помощь будет оценена; -)

Спасибо.

Ответы [ 4 ]

1 голос
/ 11 мая 2010

Я бы использовал классы UIKit для рисования, затем профилировал и оптимизировал ваш код оттуда.

Информация об Apple / iPad: текст ссылки

0 голосов
/ 01 июня 2010

CAShapeLayer в значительной степени обрабатывает ваш вариант 2. Он делает прямоугольник и закругленный прямоугольник (см. CornerRadius) по умолчанию, или вы можете указать ему путь для любой произвольной формы. Для вашего варианта 1 вы можете использовать CAShapeLayer с UIView вместо реализации drawRect, и это может быть быстрее.

0 голосов
/ 29 мая 2010

Лучше использовать объекты CGLayer. Преимущества:

  1. Это намного быстрее и более эффективно использует память. Для простых объектов добавление представления намного дороже и усложняет иерархию представления. Для сложных объектов кэширование на CGLayers может повысить производительность.

  2. Сгруппировать объекты легко. Вы просто помещаете все в новый слой, и вуаля! Там почти нет накладных расходов.

  3. Использование CGLayer и других объектов Quartz дает вам большую гибкость.

Единственным недостатком является то, что вы должны напрямую использовать Quartz 2D . Это не очень сложно, но требует некоторого изучения, если вы не использовали его раньше.

0 голосов
/ 12 мая 2010

Моим первым чувством было сделать 3-й путь, но, чтобы убедиться, сразу после того, как я опубликовал свое сообщение, я провел несколько тестов только с глобальным представлением и более 200 геометрических форм (Rect, Rounded Rect и Ellipse) на это и я двигаю только половину с событием touchMoved. Я сделал этот тест способом 1 (создание подклассов UIView) и способом 3 (создание подклассов NSObject), способ 2 кажется мне слишком ограничительным и не помогает мне вообще. Результатом является то, что способ 1 кажется более эффективным ... Нет задержки, когда я перемещаю 60 объектов вместе! Более того, использование этого способа, вероятно, помогло бы мне, потому что использование представления предоставляет некоторые интересные функции, такие как обнаружение касания по сложному пути (см. UIBezierPath), иерархия объектов, обрабатываемая классом UIView ...

Так что я воспользуюсь этим путем и вернусь сюда, чтобы поделиться своими результатами; -)

Привет

...