Рисование пользовательской графики на iPhone: CALayer против CGContext - PullRequest
5 голосов
/ 09 июня 2010

У меня есть приложение, в котором я делаю несколько пользовательских чертежей, несколько линий на градиентном фоне, например, (игнорируйте текст, они просто UILabels):

http://prehensile.co.uk/outgoing/Screenshot2010-06-09at12.22.32.png

На данный момент все это делается путем запуска нового CGContext, рисования материала в нем с помощью CGContextDrawLinearGradient и CGContextStrokePath, а затем, наконец, сохранения полученного изображения с помощью UIGraphicsGetImageFromCurrentImageContext.Информация о позиционировании рассчитывается, пока я размечаю эти метки, так что это будет PITA (и дублирование усилий), чтобы вычислить все заново, когда содержащий UIView будет нарисован с помощью drawRect, поэтому я рисую его передвремя в UIImage.Все работает отлично, пока все хорошо.

Однако у меня есть скрытое подозрение, что для рисования может быть более эффективно использовать CALayers.Мое (поверхностное) понимание различия между этими двумя подходами состоит в том, что CALayer больше похож на набор инструкций для рисования материала и поэтому занимает меньше памяти, пока он фактически не отображается на экране, в то время как предварительное рисование всего в UIImage означает, чтоу вас все время в памяти всплывает чертовски великолепное растровое изображение, независимо от того, нарисовано оно или нет.

Это правильное понимание?Что обычно считается лучшим способом рисования пользовательских изображений на iPhone?

Ответы [ 2 ]

1 голос
/ 11 июля 2012

Довольно поздний ответ, но, возможно, он будет полезен.

CA - более высокий уровень абстракции, чем CG, поэтому почти все, что вы делаете в CA, в конечном итоге будет реализовано в CG, но естьЕсть несколько преимуществ, когда обработка будет выполняться во время рендеринга и сэкономит ваше хранилище.

Для нарисованных вами путей вы можете использовать CAShapeLayer и устанавливать цвет контура и обводки при создании макета.Каждый CAShapeLayer имеет свой собственный стиль обводки, поэтому, поскольку похоже, что вы используете несколько белых линий и несколько толщин черного, для каждого отдельного стиля линий потребуется отдельный CAShapeLayer.

Для линейного градиента вы можетесделайте изображение размером 1x50 и дайте CALayer растянуть его до необходимой ширины во время рендеринга.Установите для содержимого CALayer значение CGImageRef и любой другой режим, в котором он будет растягивать содержимое.

CALayers - это явный выигрыш для использования памяти;время обработки никогда не бывает очевидным;предварительно обработанные изображения могут по-прежнему побеждать.

0 голосов
/ 13 июля 2011

Вы можете создать слой для рисования изображения, когда изображение изменилось или когда вы хотите изменить текущий рисунок, используйте [layer setNeedsDisplay], это заставит слой перерисовать содержимое.

с помощью вышеуказанного методаВы можете перерисовывать изображение по своему желанию, не рисовать снова и снова

...