2015-04-20 1 views
0

Je sais comment créer un NSImage représentant un NSView et tous ses sous-vues, mais ce que je suis après est une NSImage d'une vue ignorant ses sous-vues. Je peux penser à des façons de le faire avec une sous-classe de NSView, mais je tiens à éviter de sous-classer si possible. Quelqu'un a-t-il une idée?Faire une NSImage sur un NSView

+0

Vous pouvez supprimer temporairement les sous-vues, créer l'image, et de mettre les sous-vues en arrière. Cela était simple, mais maintenant, avec la mise en page automatique, c'est un problème, car la suppression des sous-vues supprime également les contraintes qui les référencent. –

+0

Je le ferais dans une application conçue pour m'aider à dépanner d'autres applications, donc le coup de performance associé à la suppression puis à la ré-ajout de contraintes n'est pas vraiment un gros problème - la priorité est une approche qui peut être appliquée à n'importe quelle vue hiérarchie. Si cette approche de suppression, puis de réinstallation peut être effectuée de manière fiable pour n'importe quelle vue, cela pourrait être la voie à suivre - je verrai jusqu'où je vais. –

Répondre

1

Masquer les sous-vues, saisir l'image, réafficher les sous-vues:

NSMutableArray* hiddenViews = [[NSMutableArray] alloc init]; 

for (NSView* subview in [self subviews]) { 
    if (subview hidden) [hiddenViews addObject: subview]; 
    else [subview setHidden:YES]; 
} 

NSSize imgSize = self.bounds.size; 
NSBitmapImageRep * bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]]; 
[bir setSize:imgSize]; 
[self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir]; 
NSImage* image = [[NSImage alloc] initWithSize:imgSize]; 
[image addRepresentation:bir]; 

for (NSView* subview in [self subviews]) { 
    if (![hiddenViews containsObject: subview]) 
     [subview setHidden:NO]; 
} 
+0

Vous devriez rechercher les sous-visualisations qui sont déjà masquées et ne pas les afficher à la fin. –

+0

Merci, code édité pour conserver l'état des sous-vues précédemment cachées. –

+0

C'est une excellente idée - si simple, et pourtant cela ne m'aurait jamais été familier! –

0

Je vous suggère de faire une copie du NSView hors écran et de prendre un instantané de celui-ci.