2012-08-14 7 views

risposta

13

Ci sono diversi modi, ma non funziona perfettamente. Molti problemi sono connessi con le viste Layer Backed.

se non si dispone di supporto layer o viste di hosting è possibile utilizzare questo codice:

NSData* data = [mainView dataWithPDFInsideRect:[mainView bounds]]; 
    NSImage *img = [[NSImage alloc] initWithData:data]; 

se si lavora con una vista a base di strato:

fino 10.8 il modo migliore per me era

ma in 10.8 bitmapImageRepForCachingDisplayInRect ha smesso di funzionare con viste Layer Backed.

c'è la possibilità di fare uno screenshot dello schermo e tagliare fuori la vostra vista:

+ (NSImage*) screenCacheImageForView:(NSView*)aView 
{ 
    NSRect originRect = [aView convertRect:[aView bounds] toView:[[aView window] contentView]]; 

    NSRect rect = originRect; 
    rect.origin.y = 0; 
    rect.origin.x += [aView window].frame.origin.x; 
    rect.origin.y += [[aView window] screen].frame.size.height - [aView window].frame.origin.y - [aView window].frame.size.height; 
    rect.origin.y += [aView window].frame.size.height - originRect.origin.y - originRect.size.height; 

    CGImageRef cgimg = CGWindowListCreateImage(rect, 
              kCGWindowListOptionIncludingWindow, 
              (CGWindowID)[[aView window] windowNumber], 
              kCGWindowImageDefault); 
    return [[NSImage alloc] initWithCGImage:cgimg size:[aView bounds].size]; 
} 
+0

+1 risposta completa – Vervious

+0

grazie mille !!! – NOrder

+0

La tua versione con bitmapImageRepForCachingDisplayInRect funziona correttamente per me alla 10.7 per una vista con layer supportato e ho aggiunto lo screenCacheImageForView per 10.8 - aggiornato da alcuni giorni a 10.8.3, ma screenCacheImageForView causa problemi con la mia vista (che ha 2 etichette aggiuntive NSTextField in alto e erroneamente inclusa nella schermata della vista). Ma: su 10.8.3 il bitmapImageRepForCachingDisplayInRect funziona bene - non lo era prima del 10.8.3? – konran

1

Sto usando questo codice nel mio app, che funziona alla grande.

Tuttavia, se trascino l'app su un monitor secondario, l'acquisizione dello schermo viene espulsa e viene rilevato il rect errato.

Il codice seguente consente di risolvere tale questione (ho anche rimosso alcune matematica ridondanti dal calcolo, dove un campo è stato che viene sottratto e poi aggiunto) nel caso in cui qualcuno viene attraverso questo in futuro:

NSRect originRect = [aView convertRect:[aView bounds] toView:[[aView window] contentView]]; 

NSArray *screens = [NSScreen screens]; 
NSScreen *primaryScreen = [screens objectAtIndex:0]; 

NSRect rect = originRect; 
rect.origin.y = 0; 
rect.origin.x += [aView window].frame.origin.x; 
rect.origin.y = primaryScreen.frame.size.height - [aView window].frame.origin.y - originRect.origin.y - originRect.size.height; 
Problemi correlati