0

私は単に新しいコンテキストを作成しようとしているコンポーネントを描画しようとしているのではなく (私は思う)、描画の内容を含む UIImage を吐き出そうとしています。既存のコンポーネントを描画しようとしているわけではありません。次のコードを使用しています。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, self.textSize.width, self.textSize.height, 8, 4 * self.textSize.width, 
                                             colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1);
NSString *text = @"Hello world";
[text drawAtPoint:CGPointMake(0, 0) forWidth:maxWidth withFont:font lineBreakMode:UILineBreakModeWordWrap];

CGImageRef imageMasked = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

UIImage * myRendering = [UIImage imageWithCGImage:imageMasked];

残念ながら、「無効なコンテキスト」というエラー メッセージが表示されます。Google で検索しても、既存のコンポーネントを利用しようとしている人しか出てこなかったようです。新しいUIImageを吐き出したい。

ビットマップコンテキストを作成するために、ここで例を試しました - http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203 -SW9

私はまだ得る:

: CGContextGetShouldSmoothFonts: 無効なコンテキスト : CGContextSetFont: 無効なコンテキスト : CGContextSetTextMatrix: 無効なコンテキスト : CGContextSetFontSize: 無効なコンテキスト など...

4

3 に答える 3

0

あなたは常に文脈に逆らって描きます。コンテキスト自体は、ディスプレイ、ビットマップ、またはPDFにリンクすることができます。

達成したいことに応じて、コンテキストを作成するか、既存のコンテキストを使用する必要があります。カスタムコンポーネントの場合(JPanelについて言及したため、これを意味すると思います)、UIViewのdrawRectメソッドをそのようにオーバーライドするだけです。

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();

ご覧のとおり、コンテキストはすでに作成されており、を呼び出すことで取得できますUIGraphicsGetCurrentContext()

于 2010-07-15T18:00:38.087 に答える
0

まず、 の戻り値を確認して、実際にコンテキストを作成したかどうかを確認しますCGBitmapContextCreate。すなわち

if ( context == NULL ) NSLog(@"glad I always check my return values!");

コンソールにメッセージがないか確認します。

コンテキストを作成していない場合は、iOS 4.0 以降で開発しているかどうかを確認してください。そうでない場合は、最初の引数として NULL を渡さず、mallocメモリのチャックを渡してください。

于 2010-07-16T22:54:38.540 に答える
-2

問題は、ビットマップ描画コードをviewDidLoadに入れなかったことです。私は本当にこのことを理解していません。なぜそれほど直感的でないのですか?

于 2010-07-16T01:10:53.970 に答える