2010-12-13 50 views
1

choses diverses, y compris (peut-être surtout) la fenêtre de perdre son statut de principal et d'être ramené au point, la cause certains de mes vues personnalisées pour développer le rendu glitches jusqu'à ce que je fais quelque chose (comme redimensionner la fenêtre) pour que ces vues personnalisées soient redessinées. Je suppose que cela est dû à une sorte de bogue de mise en cache dans AppKit, et je suis sûr que je ne suis pas le seul à avoir ce comportement, alors quelqu'un sait-il comment contourner ce problème?dessin de cacao pépins lorsque la fenêtre perd alors regagne le statut principal

Voici un exemple:

View drawn correctly View drawn with glitch

Notez la ligne bizarre sombre à gauche de l'arrière-plan de la vue? Ceci est dessiné même sans les sous-vues dans la vue. J'ai d'autres bugs similaires dans certaines de mes autres vues.

Voici le code qui fait le dessin:

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

    [EDLightChromeColor set]; 
    NSRectFill(topRect); 

    [EDMidChromeColor set]; 
    NSRectFill(bottomRect); 
} 

et

-(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]; 
} 

La vue est créée programatically, pas avec Interface Builder, que je ne suis pas en utilisant pour ce projet.

Répondre

3

dirtyRect ne couvre pas nécessairement rect visible de votre point de vue, de sorte que vous pouvez voir quelle partie des limites de votre point de vue intersection avec la dirtyRect et juste repeindre que. Sinon, il suffit de repeindre les limites de la vue. Le redimensionnement de la fenêtre peut entraîner la saleté (en général) des limites entières, ce qui explique probablement pourquoi vous voyez des repeints complets à ce moment-là.

+0

Je suis tout à ne pas se rendre compte que, et il est logique que je suppose que si vous avez une grande vue qui est recadrée/clipsé etc. Dessin d'un fragment de ce point de vue simple serait douloureux et probablement plus INGÉNIERIE donc je viens de changer de dessinez les limites entières et vous avez raison, le bug a disparu. Je vous remercie. – d11wtq

+0

Si le dessin devient un point d'accès lorsque vous profilez votre application à l'aide d'Instruments, vous souhaiterez peut-être y revenir. Jusque-là, je ne m'inquiéterais pas d'une optimisation prématurée de cette méthode. Vous êtes les bienvenus. –