3

で UIVIew にテキストを描画しdrawRect:ます。最初にテキストの高さを計算し、次にdrawInRect:. 以下のコードは動作します:

- (void)drawRect:(CGRect)rect
{
    CGFloat titleHeight = [self heightForText:_entry.title
                                     withFont:[UIFont systemFontOfSize:12.0f]];

    CGRect r = CGRectMake(54, 6, kCellTextWidth, titleHeight);
    [_entry.title drawInRect:r withFont:[UIFont titleFont]];
}

dispatch_async次に、main_queue で drawInRect を使用してテキストの高さを計算しますが、失敗します。

- (void)drawRect:(CGRect)rect
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        CGFloat titleHeight = [self heightForText:_entry.title
                                         withFont:[UIFont systemFontOfSize:12.0f]];

        dispatch_async(dispatch_get_main_queue(), ^{
            CGRect r = CGRectMake(54, 6, kCellTextWidth, titleHeight);
            [_entry.title drawInRect:r withFont:[UIFont titleFont]];
        });
    });
}

エラー:

 <Error>: CGContextSetFont: invalid context 0x0
 <Error>: CGContextSetTextMatrix: invalid context 0x0
 <Error>: CGContextSetFontSize: invalid context 0x0
 <Error>: CGContextSetTextPosition: invalid context 0x0
 <Error>: CGContextShowGlyphsWithAdvances: invalid context 0x0

エラーはどういう意味ですか? 速度を向上させるために、別のスレッドでテキストの高さを計算するにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

3

セカンダリ スレッドから CoreGraphics および CoreText API を使用できます。

セカンダリ スレッドから安全に呼び出せる UIKit API はごくわずかです。原則として、UIKit API はメイン スレッドのみを対象としています。

このエラーは、NULLコンテキストが CG-API に渡されていることを意味します。セカンダリ スレッドは、既定では作成しません。独自のレンダリング コンテキストと、セカンダリ スレッドでレンダリングする宛先を作成する必要があります。UIKit 呼び出しは、スレッドのコンテキスト スタックのトップ コンテキストを取得するだけです。コンテキスト スタックは、セカンダリ スレッドにも、このコンテキストにも存在しません。

速度に関して言えば、1 つのラベルがこれほど顕著な速度低下を引き起こすとは信じがたいです。おそらく、より多くのコンテキストが役立つでしょう。

于 2012-09-04T10:21:45.767 に答える
1

同様の問題がありUIGraphicsPushContext(context)/UIGraphicsPopContext(context)、描画コードで解決しました。で作成されたコンテキスト

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGImageAlphaPremultipliedLast);
于 2013-03-27T08:41:48.737 に答える