Решение, которое я нашел, что, по крайней мере, сработало в моем случае, заключалось в подклассе CALayer
. Когда на слой отправляется сообщение renderInContext:
, этот слой автоматически пересылает это сообщение всем своим подуровням. Поэтому все, что мне нужно было сделать, это создать подкласс CALayer
, переопределить метод renderInContext:
и отобразить то, что мне нужно было отрендерить в предоставленном контексте.
Например, в моем коде у меня был слой, для которого я устанавливал его содержимое в виде стрелки:
UIImage *image = [UIImage imageNamed:@"arrow.png"];
MYLayer *myLayer = [[CALayer alloc] init];
[myLayer setContents:(__bridge id)[image CGImage]];
[self.mainLayer addSublayer:myLayer];
Теперь, когда я применял 3D-вращение на 180 градусов по оси Y на стрелке и пытался сделать [self.mainLayer renderInContext:context]
, после этого я все еще получал не повернутое изображение.
Итак, в моем подклассе MyLayer
я переопределил renderInContext:
и использовал уже повернутое изображение для рисования в предоставленном контексте:
- (void)renderInContext:(CGContextRef)ctx
{
NSLog(@"Rendered in context");
UIImage *image = [UIImage imageNamed:@"arrow_rotated.png"];
CGContextDrawImage(ctx, self.bounds, image.CGImage);
}
В моем случае это сработало, однако я вижу, что если вы делаете много 3D-преобразований, вы не сможете подготовить изображение для любого возможного сценария. Однако во многих других случаях должна быть возможность визуализировать результат трехмерного преобразования, используя двумерные преобразования в переданном контексте. Например, в моем случае вместо использования другого изображения arrow_rotated.png
я мог бы использовать изображение arrow.png
, отразить его и нарисовать в контексте.