2011-03-13 53 views
2

我遵循this answer中列出的指示,以在Core Graphics中填充具有圖案的圖層。當圖層是CALayer子類時,繪圖工作正常。但是,當圖層是CATiledLayer子類時,運行時會出現EXC_BAD_ACCESS錯誤。如何在CATiledLayer中繪製平鋪圖案圖像?

static void drawPatternImage (void *info, CGContextRef ctx) 
{ 
    CGImageRef image = (CGImageRef) info; 
    CGContextDrawImage(ctx, 
         CGRectMake(0,0, CGImageGetWidth(image),CGImageGetHeight(image)), 
         image); // EXC_BAD_ACCESS here :(
} 

static void releasePatternImage(void *info) 
{ 
    CGImageRelease((CGImageRef)info); 
} 

// pattern creation 
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); 
theLayer.backgroundColor = color; 
CGColorRelease(color); 

我需要做什麼才能在CATiledLayer子類中繪製圖案圖像?

+0

嗨!感謝這個代碼。它不會崩潰,圖像被正確繪製,並且不是倒置的,但它似乎是從底部繪製的,因爲當我調整窗口大小時,底部是固定的,而頂部正在移動。你知道我怎麼能有相反的工作? – aneuryzm 2013-02-13 08:25:34

回答

6

我使用 「CGContextDrawTiledImage」 中的 「drawLayer」 方法一CATiledLayer類:

在.H:

@interface StarView : UIView { 
    UIImage *imgTextureCarta; 
} 

在.M

- (id)initWithFrame:(CGRect)frame { 
    NSString* imagePath = [ [ NSBundle mainBundle] pathForResource:@"aTexture" ofType:@"png"]; 
    imgTextureCarta = [UIImage imageWithContentsOfFile: imagePath]; 
    [imgTextureCarta retain]; 
    CGImageRef texureCarta; 
    texureCarta = (imgTextureCarta.CGImage); 
} 



-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context{ 
    CGImageRef texureCarta; 
    texureCarta = (imgTextureCarta.CGImage); 
    CGRect bounds = layer.bounds; 
    CGContextSetBlendMode (context, 0); 
    CGContextClipToRect(context, layer.bounds); 
    CGContextDrawTiledImage(context, CGRectMake(0,0, 128, 120), texureCarta); 
} 

- (void)dealloc { 
    [imgTextureCarta release]; 
    [super dealloc]; 
} 
+0

優秀!完美工作 - 謝謝。 – 2011-03-13 17:22:55

+0

不客氣... – meronix 2011-03-13 20:03:34

+2

這會使圖像上下顛倒。您可以在繪製之前將其翻轉:'CGContextScaleCTM(ctx,1,-1);' – 2012-01-06 19:13:44