1

通常、無効なコンテキストで描画すると、無効なコンテキスト 0x00 のようなものが表示されますが、アドレスが表示されるため、これは当てはまりません。そして、すべての Core Graphics コードは、ビューの 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、 2回目のcontext呼び出し後に再割り当てする必要があります。UIGraphicsBeginImageContext()

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

Justin の回答に加えて、コードを drawRect 内に配置する必要はありません。複数回呼び出され、「形状」が変更されたときにパターンの背景を再描画するだけで済みます。

setShape でコードを呼び出します。

于 2012-11-20T10:48:41.513 に答える