2010-03-26 12 views
10

Ich möchte ein CGImage über einen CALayer kacheln, aber es scheint nur zu dehnen.Wie kachelt man den Inhalt eines CALayers?

Das Codebeispiel:

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

Ich möchte Subklassen vermeiden, wenn ich könnte.

Antwort

13

Sie können eine Farbe mit einem Musterbild erstellen und diese als Hintergrundfarbe für die Ebene festlegen.

Dazu müssen Sie Ihre CGImage in eine CGPattern wickeln und daraus eine CGColor machen.

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

Dieser Code wurde vom GeekGameBoard-Beispielcode geändert.

+1

Ich habe gerade bemerkt + colorWithPatternImage in UIColor, ist dieses Ding ähnlich? –

+0

Ja, das sollte das gleiche tun, obwohl ich es nicht getestet habe. "UIColor" war in iPhone OS nicht immer verfügbar, daher bin ich es gewohnt, die CGColor-Methoden zu verwenden. –

+1

Ich bin mir nicht ganz sicher, aber es scheint mir, dass die Verwendung von Bildern als 'backgroundColor' die Fähigkeit, es zu animieren, bricht. (Ich habe eine Frage dazu gestellt [http://stackoverflow.com/questions/5605618/core-animation-animation-doesnt-work].) – ryyst

0

Sie könnten CGContextDrawTiledImage Methode für diese

2

beschäftigen Das ist ziemlich einfacher. Aber Vorsicht, dies ist eine private API, Verwendung auf eigene Gefahr.

-Setup wie folgt

#import <QuartzCore/QuartzCore.h> 

CA_EXTERN NSString * const kCAContentsScalingRepeat; 

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

Dann tun gerade diese

[myLayer setContentsScaling:kCAContentsScalingRepeat]; 
+0

Wie @sdykes erwähnt, ist dies eine private API und muss vorsichtig verwendet werden (wenn überhaupt). Falls Sie sich fragen, was die möglichen Werte sind, die einzigen, die ich finden konnte, waren kCAContentsScalingStretch und kCAContentsScalingRepeat. Ein bisschen Trivial :) – Buzzy

9

Die einfachste Code, dies zu erreichen ist:

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

Hinweis das funktioniert nur auf OS X 10.8 und höher –

+0

Ah, richtig. Ich bin ziemlich iOS-centric. Danke, dass du darauf hingewiesen hast. –

+0

Es ist Arbeit, aber alles ist umgekehrt !!! –

Verwandte Themen