通常当您在无效的上下文中绘制时,您会看到类似无效的上下文0x00,但事实并非如此,因为我看到了一个地址。我的所有Core Graphics代码都在一个视图的drawRect中。 有时,并非总是如此,我看到: “:CGContextFillRects:无效的上下文0xa88a500” 有时似乎我的代码有效,但其他代码失败。 我想画的就像面具一样。
如果你在这里看到任何错误,你能告诉我吗?:
UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context,[[UIColor blackColor] CGColor]); CGContextFillRect(context,rect);
switch (shape) {
case SHAPE_ELIPSE:
//
CGContextAddEllipseInRect(context, maskBox);
CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
CGContextFillEllipseInRect(context, maskBox);
break;
case SHAPE_SQUARE:
//
CGContextAddRect(context, maskBox);
CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
CGContextFillRect(context, maskBox);
break;
default:
break;
}
CGContextStrokePath(context);
UIImage *backGroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef maskRef = backGroundImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
UIGraphicsBeginImageContext(rect.size);
CGContextRef contextBlack = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextBlack, [[UIColor blackColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *blackImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef masked = CGImageCreateWithMask([blackImage CGImage], mask);
CGImageRelease(mask);
[self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageWithCGImage:masked]]];
CGImageRelease(masked);
非常感谢。
答案 0 :(得分:1)
调用UIGraphicsEndImageContext()
会使上下文context
无效。但是,您的程序继续使用该变量。 IOW,您应该在第二次致电context
之后重新分配UIGraphicsBeginImageContext()
:
context = UIGraphicsGetCurrentContext();
答案 1 :(得分:1)
除了Justin回答:无需将代码放在drawRect中。它将被多次调用,你只需要在“形状”改变时重绘图案背景。
调用setShape中的代码。