2010-03-26 15 views
10

Mi piacerebbe affiancare un CGImage a un CALayer, ma sembra voler solo allungarlo.Come affiancare il contenuto di un CALayer?

Il codice di esempio:

self.background = [UIImage imageNamed: @"Background.png"]; 
[documentDisplay.layer setContents: self.background.CGImage]; 

vorrei evitare sottoclassi se potessi.

risposta

13

È possibile creare un colore con un'immagine di motivo e impostarlo come colore di sfondo del livello.

Per fare ciò è necessario avvolgere il proprio CGImage in un CGPattern e creare un CGColor da esso.

// callback for CreateImagePattern. 
static void drawPatternImage (void *info, CGContextRef ctx) 
{ 
    CGImageRef image = (CGImageRef) info; 
    CGContextDrawImage(ctx, 
         CGRectMake(0,0, CGImageGetWidth(image),CGImageGetHeight(image)), 
         image); 
} 

// callback for CreateImagePattern. 
static void releasePatternImage(void *info) 
{ 
    CGImageRelease((CGImageRef)info); 
} 

//assume image is the CGImage you want to assign as the layer background 
int width = CGImageGetWidth(image); 
int height = CGImageGetHeight(image); 
static const CGPatternCallbacks callbacks = {0, &drawPatternImage, &releasePatternImage}; 
CGPatternRef pattern = CGPatternCreate (image, 
         CGRectMake (0, 0, width, height), 
         CGAffineTransformMake (1, 0, 0, 1, 0, 0), 
         width, 
         height, 
         kCGPatternTilingConstantSpacing, 
         true, 
         &callbacks); 
CGColorSpaceRef space = CGColorSpaceCreatePattern(NULL); 
CGFloat components[1] = {1.0}; 
CGColorRef color = CGColorCreateWithPattern(space, pattern, components); 
CGColorSpaceRelease(space); 
CGPatternRelease(pattern); 
yourLayer.backgroundColor = color; //set your layer's background to the image 
CGColorRelease(color); 

Questo codice viene modificato dal codice di esempio GeekGameBoard.

+1

ho appena notato + colorWithPatternImage in UIColor, è questa cosa simile? –

+0

Sì, questo dovrebbe fare la stessa cosa, anche se non l'ho provato. 'UIColor' non è sempre stato disponibile su iPhone OS, quindi sono abituato ad usare i metodi' CGColor'. –

+1

Non ne sono del tutto sicuro, ma mi sembra che usare le immagini come 'backgroundColor' interrompa la capacità di animarlo. (Ho pubblicato una domanda al riguardo [qui] (http://stackoverflow.com/questions/5605618/core-animation-animation-doesnt-work).) – ryyst

0

Si potrebbe impiegare il metodo CGContextDrawTiledImage per questo

2

Questo è piuttosto semplice. Ma attenzione, questa è un'API privata, usata a proprio rischio.

Setup come segue

#import <QuartzCore/QuartzCore.h> 

CA_EXTERN NSString * const kCAContentsScalingRepeat; 

@interface CALayer (CALayerAdditions) 
@property(copy) NSString *contentsScaling; 
@end 

Poi basta fare questo

[myLayer setContentsScaling:kCAContentsScalingRepeat]; 
+0

Come @sdsykes menzionato, questa è un'API privata e deve essere utilizzata con attenzione (se non del tutto). Nel caso ti stia chiedendo quali siano i possibili valori, gli unici che ho trovato sono stati kCAContentsScalingStretch e kCAContentsScalingRepeat. Un po 'di curiosità :) – Buzzy

9

Il codice più semplice per raggiungere questo obiettivo è:

CALayer *layer = [CALayer layer]; 
layer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background_tile"]].CGColor; 
+0

Nota che funziona solo su OS X 10.8 e sopra –

+0

Ah, giusto. Sono abbastanza iOS-centrico. Grazie per la segnalazione. –

+0

È lavoro ma tutto è rovescio !!! –

Problemi correlati