2011-03-13 48 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