1

Jusqu'à macOS 10,12 le code suivant a bien fonctionné sur un fil de fond:macOS 10,13 High Sierra: [NSGraphicsContext flushGraphics] sur un fil de fond n'a pas d'effet

[nsView lockFocusFocus]; 
... draw something ... 
[[NSGraphicsContext currentContext] flushGraphics]; 
[nsView unlockFocus]; 

Avec 10,13 Cependant, flushGraphics ne met pas à jour le contenu de la vue immédiatement plus.

Je comprends que le dessin à partir d'un fil de fond est maintenant déconseillé, mais cela ne devrait pas signifier que ce n'est plus possible. En fait, tout dans ... dessine quelque chose ... va toujours au backing store de la vue. Une fois que drawRect: est appelé la prochaine fois sur le thread d'interface utilisateur principal, la vue est actualisée avec tout le contenu correctement en place.

Comment cela peut-il se produire immédiatement? Y a-t-il un moyen d'apporter des modifications à la vue immédiatement visible?

Répondre

0

Il s'est avéré qu'avec macOS 10.13, si drawRect: ne dessine rien dans le cadre de cette méthode, l'affichage de la vue ne sera pas actualisé, même si sa banque de sauvegarde a été modifiée.

Donc, si vous voulez vider les modifications en attente à l'écran, l'astuce est de faire AppKit penser quelque chose a été établi, en tirant au moins un petit rectangle invisible:

- (void) drawRect: (NSRect)rect 
{ 
    if (drawRectWasRequestedByRefresh) { 
     // flush pending changes drawn on background thread 
     [[NSColor clearColor] set]; 
     [NSBezierPath strokeRect: NSMakeRect(0,0,1,1)]; 
     drawRectWasRequestedByRefresh = NO; 
    } else { 
     // draw your view's regular contents here 
    } 
} 

Pour déclencher cette actualisation d'un fil d'arrière-plan, utilisez ce hack:

- (void) refresh 
{ 
    drawRectWasRequestedByRefresh = YES; 
    [self setNeedsDisplay: YES]; 
} 

Ceci est certainement un sale hack qui ne sera nécessaire pour les applications qui nécessitent le dessin immédiat d'un fil de fond (pour une raison quelconque). Si quelqu'un connaît une meilleure solution, je serai heureux d'en entendre parler!