2009-11-01 12 views
6

Sto provando a utilizzare l'immagine principale sull'iPhone. Sono in grado di comporre i miei colori usando il quarzo per disegnare uniview, ma voglio separare ciascun componente in CALayer (UIview consuma più risorse).colori compositi: modalità CALayer e fusione su iPhone

quindi ho una maschera bianca che voglio utilizzare per filtrare un bitmap di sfondo, e voglio provare diverso metodo di fusione. Sfortunatamente, gli strati stanno solo "aggiungendo" i loro colori.

Ecco il mio codice:

@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 

E qui è il principale codice di vista drawrect, dove io uso il mio 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]; 

} 

C'è qualcosa che non va?

risposta

1

Non a tutti ... Credo che questo sia più facile da usare OpenGL per raggiungere questo obiettivo, perché sembra non essere ancora implementato in CA.

3

Questo metodo sembra non essere un difetto di Core Animation, perché gli strati sono prerendered in contesti di immagine. Core Image viene utilizzato per il filtraggio in tempo reale (durante l'animazione e quant'altro) di queste immagini rispetto ai livelli di sfondo e alle loro immagini. Quindi le proprietà di compositing di CALayer sono utilizzate per questa abilità, che non sono ancora disponibili su iPhone/iOS (a causa della necessità di Core Image).

OpenGL può fare questo per noi nella nostra situazione, tuttavia =)

modificare (aggiungere): l'impostazione della modalità di miscelatura con CGContext in -drawInContext: e -drawLayer: InContext: non ovviamente ancora hanno effetto con quello che era già rappresentato o presente nell'immagine di quel contesto. (quando è impostato prima che qualcosa fosse reso nel contesto (immagine di s), è l'effetto di fondersi con il nero completo o il bianco completo (non sono sicuro quale =)

+1

non è CoreImage ora disponibile su iOS? – openfrog

+1

@openfrog sì, ma è limitato confrontato con OS X. ad esempio su OS X CALayers può avere filte compositing rs. Su iOS, non così tanto. –

7

Sono riuscito a ottenere l'effetto di . compositing più CALayers disegnandole direttamente nel contesto grafico di un UIView

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

BTW, non ho aggiunto gli strati come sottolivelli del livello della vista (cioè non ho mai chiamato [myView.layer addSublayer: mylayer])

+5

se non si sta implementando la funzione CALayer delegato "- (void) drawLayer: (CALayer *) strato InContext: (CGContextRef) contesto", è necessario utilizzare [mylayer renderInContext: c] – jkr