1

通常,当您在无效上下文中绘制时,您会看到类似于无效上下文 0x00 的内容,但事实并非如此,因为我看到了一个地址。我所有的核心图形代码都在视图的 drawRect 内。有时,并非总是如此,我会看到:“:CGContextFillRects:无效上下文0xa88a500” 有时我的代码似乎有效,但其他代码却失败了。我想画的是面具之类的东西。

如果您在这里发现任何问题,您能告诉我吗?:

UIGraphicsBeginImageContext(rect.size); CGContextRef 上下文 = 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);

非常感谢。

4

2 回答 2

1

调用UIGraphicsEndImageContext()会使上下文无效context。但是,您的程序继续使用该变量。IOW,您应该在第二次context调用后重新分配:UIGraphicsBeginImageContext()

context = UIGraphicsGetCurrentContext();
于 2012-11-20T08:58:21.400 回答
1

除了贾斯汀回答:无需将您的代码放在drawRect中。它将被多次调用,您只需要在“形状”更改时重新绘制图案背景。

调用 setShape 中的代码。

于 2012-11-20T10:48:41.513 回答