2010-03-26 6 views
10

Je voudrais placer une CGImage sur un CALayer, mais il semble vouloir seulement l'étirer.Comment paver le contenu d'un CALayer?

Le code exemple:

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

Je voudrais éviter le sous-classement si je pouvais.

Répondre

13

Vous pouvez créer une couleur avec une image de motif et définir que la couleur d'arrière-plan de la couche.

Pour ce faire, vous devez envelopper votre CGImage dans un CGPattern et faire un CGColor de celui-ci.

// 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); 

Ce code est modifié à partir de l'exemple de code GeekGameBoard.

+1

Je viens de remarquer + colorWithPatternImage dans UIColor, est cette chose similaire? –

+0

Oui, cela devrait faire la même chose, même si je ne l'ai pas testé. 'UIColor' n'a pas toujours été disponible dans iPhone OS, j'ai donc l'habitude d'utiliser les méthodes' CGColor'. –

+1

Je ne suis pas entièrement sûr, mais il me semble que l'utilisation d'images comme backgroundColor ne permet pas de l'animer. (J'ai posté une question à ce sujet [ici] (http://stackoverflow.com/questions/5605618/core-animation-animation-doesnt-work).) – ryyst

0

Vous pouvez employer la méthode CGContextDrawTiledImage pour cette

2

Ce qui est assez simple. Mais attention, il s'agit d'une API privée, utilisez à vos risques et périls.

installation comme suit

#import <QuartzCore/QuartzCore.h> 

CA_EXTERN NSString * const kCAContentsScalingRepeat; 

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

Ensuite, faites tout ce

[myLayer setContentsScaling:kCAContentsScalingRepeat]; 
+0

Comme @sdsykes mentionné, il s'agit d'une API privée et doit être utilisé avec soin (le cas échéant). Au cas où vous vous demandez quelles sont les valeurs possibles, les seules que j'ai pu trouver étaient kCAContentsScalingStretch et kCAContentsScalingRepeat. Un peu de trivia :) – Buzzy

9

Le code le plus simple d'y arriver est:

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

Notez que cela ne fonctionne que sur OS X 10.8 et au-dessus –

+0

Ah, à droite. Je suis plutôt centré sur iOS. Merci d'avoir fait remarquer cela. –

+0

C'est du travail mais tout est inversé !!! –