Pergunta

Sou capaz de criar um UIImage a partir de uma camada de animação central usando o seguinte código:

- (UIImage*)contentsImage;
{
   UIGraphicsBeginImageContext([self bounds].size);
   [self renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

Este código está na minha classe derivada de calayer. O problema que estou concordando é que tenho dois cashapelyers que são camadas infantis da minha camada que não são renderizadas para a imagem resultante. Se eu adicionar caligedas padrão quando crianças, elas são renderizadas bem. Os documentos da Apple dizem:

Renderiza o receptor e suas subcamadas no contexto especificado.

Ele também diz que está disponível desde o iPhone OS 2.0. Quer saber se há algo que estou perdendo ou se devo registrar um radar.

Alguma idéia do que pode impedir que a criança em Cashapelyers seja atraída para a imagem?

Obrigado.

Foi útil?

Solução

O mecanismo de calayer chama RenderIncOntext para criar sua propriedade de conteúdo de bitmap. Mas em um Cashapelyer, a propriedade Path não é realmente prestada ao seu conteúdo, como visto por esta nota no cabeçalho:

A forma como um todo é composta entre o conteúdo da camada e sua primeira subcamada.

É lógico que o renderinntext não renderize o caminho do CashapeLayer em seu contexto. Na verdade, eu não experimentei isso por mim mesmo.

Outras dicas

Não sei se é relevante para você, mas há uma nota na documentação da Calayer para renderincontext que diz:

**Important**: The Mac OS X v10.5 implementation of this method does not
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally,
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers
and properties.

De qualquer forma, encontrei um problema semelhante ao usar a função UIView Drawrect em conjunto com o desenho em um contexto de imagem. O UIView geral que continha subviews não desenharia suas subviews se eu ligasse para o Drawrect (o que faz sentido agora, já que diz na documentação se você chamar o drawrect, você é responsável por preencher toda a área, independentemente das implementações super e subview). Eu resolvi meu problema ao apenas chamar Drawrect em todas as minhas subviews, passando por seus próprios quadros.

Então, eu sugeriria que talvez se afaste do renderincontext e use o Drawinctontext da Calayer? Você precisará substituir o método, pois ele não faz nada por padrão. Suas subclasses também precisarão mover os contextos para os quadros apropriados. Também para estar seguro, você pode verificar se nenhum código que você adiciona afeta a renderização normal dessas camadas.

Eu arquivei um radar nisso. Não consigo ver nenhum motivo nos documentos que ele não deve funcionar. Vou responder aqui se/quando a Apple responder ao radar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top