2010-12-13 20 views
1

メインステータスを失ってフォーカスが戻ってしまうなど、さまざまなことが原因で、カスタムビューの一部でレンダリングの不具合が発生する(ウィンドウのサイズを変更するなど)、これらのカスタムビューを再描画します。私はこれがAppKitのある種のキャッシングバグに起因すると考えています。私はこの動作を得ている唯一の人ではないと確信しています。誰でもその回避方法を知っていますか?ウィンドウが失われたときにココア描画グリッチが発生し、メインステータスが取り戻される

View drawn correctly View drawn with glitch

お知らせビューの背景の左側にある奇妙な暗線:

例はここに?これは、ビュー内のサブビューがなくても描画されます。他のいくつかのビューでは、他にも同様のバグがあります。

void EDDrawGlossEffectInRect(NSRect dirtyRect) { 
    NSRect topRect, bottomRect; 
    NSDivideRect(dirtyRect, &topRect, &bottomRect, (dirtyRect.size.height/2), NSMaxYEdge); 

    [EDLightChromeColor set]; 
    NSRectFill(topRect); 

    [EDMidChromeColor set]; 
    NSRectFill(bottomRect); 
} 

-(void)drawRect:(NSRect)dirtyRect { 
    EDDrawGlossEffectInRect(dirtyRect); 

    NSBezierPath *path = [NSBezierPath bezierPath]; 
    [path setLineWidth:1.0]; 

    NSPoint startPoint = {0, dirtyRect.size.height}; 
    NSPoint endPoint = {dirtyRect.size.width, dirtyRect.size.height}; 

    [path moveToPoint:startPoint]; 
    [path lineToPoint:endPoint]; 

    [[NSColor colorWithCalibratedWhite:0.7 alpha:1] set]; 

    [path stroke]; 
} 

ビューをプログラム的に作成された、ではない私は、このプロジェクトのために使用していないよInterface Builderを、と:

はここで描画を行うコードです。

答えて

3

dirtyRectは、ビューの表示矩形を必ずしもカバーしないため、ビューの境界のどの部分がdirtyRectと交差しているかを確認して再描画することができます。それ以外の場合は、ビューの境界線を再描画します。ウィンドウのサイズを変更すると、境界線全体が汚れてしまうことがあります(通常、その点で完全な塗り直しが行われている可能性があります)。

+0

私は完全にそれを理解していませんでした。あなたは大きな画像を切り取ったり、切り抜いたりしているかどうかはわかります。この単純なビューの断片を描くと、痛いかもしれません。全体の境界線を描くと正しいです、バグは消えました。ありがとうございました。 – d11wtq

+0

Instrumentを使用してアプリのプロファイルを作成するときに描画がホットスポットになる場合は、これを再度ご覧ください。それまでは、この方法を早めに最適化することについては心配しませんでした。どういたしまして。 –

関連する問題