нарисовать CALayer в CGContext - PullRequest
7 голосов
/ 26 мая 2011

У меня есть следующий код:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSaveGState(context);

CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor orangeColor].CGColor;
sublayer.cornerRadius = 20.0;
sublayer.frame = CGRectMake(20, 0, 300, 20);

[sublayer setNeedsDisplay];
[sublayer drawInContext:context];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

Но когда я просматриваю возврат newImage, появляется только пустое изображение. Когда я изменяю drawInContext на renderInContext, я получаю вышеуказанный подслой, но кажется, что система координат не работает

Есть идеи, почему drawInContext на вышеуказанном не работает?

Ответы [ 2 ]

7 голосов
/ 26 июня 2015

Попробуйте использовать renderInContext вместо drawInContext.

Насколько я понимаю, drawInContext должен быть переопределен, тогда как renderInContext используется для визуализации содержимого слоя в контексте.

С документация :

- drawInContext:

Реализация этого метода по умолчанию не выполняет никакого рисования. Если делегат уровня реализует метод drawLayer:inContext:, этот метод вызывается для фактического рисования.

Подклассы могут переопределить этот метод и использовать его для рисования содержимого слоя. При рисовании все координаты должны быть указаны в точках в пространстве логических координат.

1025 *
*

- renderInContext:

Этот метод выполняет рендеринг непосредственно из дерева слоев, игнорируя любые анимации, добавленные в дерево рендеринга. Визуализирует в координатном пространстве слоя.

3 голосов
/ 27 мая 2011

Система координат сама по себе не испорчена. Кварц использует другую систему координат, чем UIKit. В Кварце ось Y начинается в нижнем левом углу прямоугольника кадрирования. Значения становятся больше по мере того, как вы двигаетесь дальше «вверх» по прямоугольнику. Для визуального представления см. Документацию на

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

Это отличается от UIKit тем, что начало координат системы координат UIKit - это верхний левый угол, а значения оси y становятся более положительными при перемещении «вниз».

Что касается того, почему drawInContext: не работает, вы также должны ссылаться на документы для класса CALayer, где говорится: «Реализация по умолчанию ничего не делает».

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html

...