2012-08-14 8 views

Respuesta

13

Existen varias formas, pero ninguna de ellas funciona perfecta. Muchos problemas están relacionados con las vistas de Layer Backed.

si usted no tiene respaldo capa o puntos de vista de alojamientos que usted puede utilizar este código:

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

si se trabaja con vistas a base de capas:

hasta 10.8 de la mejor manera para mí fue

 NSSize mySize = mapImage.bounds.size; 
     NSSize imgSize = NSMakeSize(mySize.width, mySize.height); 
     NSBitmapImageRep *bir = [mapImage bitmapImageRepForCachingDisplayInRect:[mapImage bounds]]; 
     [bir setSize:imgSize]; 
     [mapImage cacheDisplayInRect:[mapImage bounds] toBitmapImageRep:bir]; 
     caheImg = [[NSImage alloc]initWithSize:imgSize]; 
     [caheImg addRepresentation:bir]; 

pero en 10.8 bitmapImageRepForCachingDisplayInRect dejó de funcionar con vistas de Layer Backed.

no es una opción para hacer una captura de pantalla de la pantalla y recortar su punto de 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 respuesta completa – Vervious

+0

muchas gracias! – NOrder

+0

Su versión con bitmapImageRepForCachingDisplayInRect funciona bien para mí en 10.7 para una vista respaldada por capas y agregué su screenCacheImageForView para 10.8 - actualizado desde algunos días a 10.8.3, pero screenCacheImageForView causa problemas con mi vista (que tiene 2 etiquetas NSTextField adicionales en la parte superior y erróneamente incluido en la captura de pantalla de la vista). Pero: en 10.8.3, el bitmapImageRepForCachingDisplayInRect funciona bien, ¿no es así antes de 10.8.3? – konran

1

Estoy usando este código en mi aplicación, que funciona muy bien.

Sin embargo, si arrastro la aplicación a un monitor secundario, la captura de pantalla se descarta y me capturan correctamente.

El siguiente código fija esa cuestión (También he eliminado algunas matemáticas redundantes de cálculo en la que se va a restar un campo y luego agregado) en caso de que alguien se cruce en el 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; 
Cuestiones relacionadas