0

私が達成しようとしていること

バックグラウンドですべての描画をレンダリングしようとしている UICollectionView があり、フェードインアニメーションで終了すると表示されます。

私はすでに画像でこれをうまくやっていますが、一部の描画はテキストのみです。テキストのサイズを適切に調整してから、背景に描画する必要があります。

大量のテキストになる可能性があり、メイン スレッドで実行するとスタッタリングが発生します。

私はどのようにそれをしようとしていますか

私はCGBitmapContextCreate画像に使用していたので、テキストでもそれをやろうとしました:

-(void)drawTextFromBundle
{
     UIFont * font = [UIFont AvenirLTStdBlackObliqueWithSize:35]; //custom font

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
         CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
         CGContextRef context = CGBitmapContextCreate(NULL, 250, backgroundHeight - 112, 8, 250 * 4, colorSpaceRef, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
         CGColorSpaceRelease(colorSpaceRef);
         [_text drawInRect:CGRectMake(0, 0, 250, backgroundHeight - 112) withFont:font];
          CGImageRef outputImage = CGBitmapContextCreateImage(context);
          imageRef = outputImage;
         [self performSelectorOnMainThread:@selector(finishDrawingImage) withObject:nil waitUntilDone:YES];
         CGContextRelease(context);
         CGImageRelease(outputImage);
   });
}

詳細

多くのエラーが発生しているため、これは明らかに正しい方法ではありません。すべてCore Graphicsのテキスト関数に関連しています。<Error>: CGContextSetFont: invalid context 0x0

あることは知っていますがUIGraphicsGetCurrentContext、そうではないと聞いたので、これがスレッドセーフかどうかはわかりませんでした。

注意すべきは、このメソッドは実際に-drawRect:メソッド内から呼び出されているということです。私の画像では、まったく同じコンテキストパラメーターが機能しています。

すべてバックグラウンドで安全に行われ、必要なカスタマイズに合わせてテキストを描画するにはどうすればよいですか? 適切なサイズに収まるようにテキストを縮小しながらそれを行う方法を教えていただければボーナスポイントです。

SOチームに感謝します。

4

1 に答える 1

-1

UI を変更するときは、メイン スレッド (メイン キュー) で必要です。

以下をメインキューに入れてみてください

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, 250, backgroundHeight - 112, 8, 250 * 4, colorSpaceRef, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colorSpaceRef);

    dispatch_async(dispatch_get_main_queue(), ^{
        [_text drawInRect:CGRectMake(0, 0, 250, backgroundHeight - 112) withFont:font];
        CGImageRef outputImage = CGBitmapContextCreateImage(context);
        imageRef = outputImage;
        [self performSelectorOnMainThread:@selector(finishDrawingImage) withObject:nil waitUntilDone:YES];
    });

    CGContextRelease(context);
    CGImageRelease(outputImage);
});
于 2012-10-30T07:50:57.367 に答える