2009-11-01 10 views
6

Estoy tratando de usar la imagen central en el iphone. Puedo combinar mis colores usando cuarzo para dibujar una uiview, pero quiero separar cada componente en CALayer (UIview consume más recursos).colores compuestos: CALayer y modo de mezcla en el iPhone

Así que tengo una máscara blanca que quiero usar para filtrar un mapa de bits de fondo, y quiero probar diferentes modos de fusión. Desafortunadamente, las capas solo están "agregando" sus colores.

Aquí está mi código:

@implementation WhiteLayerHelper 

    - (void)drawLayer:(CALayer *)theLayer 
      inContext:(CGContextRef)myContext 
    { 
     // draw a white overlay, with special blending and alpha values, so that the saturation can be animated 
     CGContextSetBlendMode(myContext,kCGBlendModeSaturation); 
     CGContextSetRGBFillColor(myContext,1.0,1.0,1.0,0.9); 
     CGContextFillRect(myContext,[UIScreen mainScreen].bounds); 

    } 

@end 

Y aquí es el código de la vista principal drawrect, donde utilizo mi CALayer:

- (void)drawRect:(CGRect)rect { 
    //get the drawing context 
    CGContextRef myContext = UIGraphicsGetCurrentContext(); 
    // draw the background 
    [self fillContext:myContext withBounds:m_overlayRect withImage:m_currentImage]; 
    [whiteLayer renderInContext:myContext]; 

} 

¿Hay algo mal?

Respuesta

1

No, en absoluto ... Creo que es más fácil de usar OpenGL para lograr esto, porque parece que aún no está implementado en CA.

3

Este método parece no ser un defecto de Core Animation, porque las capas se procesan en contextos de imagen. Core Image se utiliza para el filtrado en tiempo real (durante la animación y otras cosas) de estas imágenes contra las capas de fondo y sus imágenes. Por lo tanto, las propiedades de composición de CALayer se utilizan para esta capacidad, que no están disponibles en iPhone/iOS (todavía) debido a los requisitos de Core Image.

OpenGL puede hacer esto por nosotros en nuestra situación, sin embargo =)

editar (añadir): establecer el modo de mezcla con CGContext en -drawInContext: y -drawLayer: InContext: no, por supuesto, todavía tienen efecto con lo ya estaba representado o presente en la imagen de ese contexto. (cuando se establece antes de que se haya renderizado algo en el contexto (imagen de s), es el efecto de mezclar contra negro completo o blanco completo (no estoy seguro de cuál =)

+1

¿No está disponible CoreImage ahora en iOS? – openfrog

+1

@openfrog sí, pero es limitado en comparación con OS X. Por ejemplo, en CALIBRADOR OS X, los usuarios pueden tener filtros de composición rs. En iOS, no tanto. –

7

Logré obtener el efecto de . componer múltiples CALayers dibujando directamente en contexto gráfico de un UIView

-(void)drawRect:(CGRect)rect { 
CGContextRef c = UIGraphicsGetCurrentContext(); 
CGContextSetBlendMode(c, kCGBlendModeDifference); 
[myLayer drawInContext:c]; 
} 

por cierto, no añadí las capas como subcapas de la capa de la vista (es decir que nunca llamé [myView.layer addSublayer: myLayer])

+5

si no está implementando la función de delegado de calayer "- (void) drawLayer: (CALayer *) capa en el contexto: (CGContextRef) context", debe usar [mylayer renderInContext: c] – jkr

Cuestiones relacionadas