Frage

Ich habe eine NSView, die eine NSScrollView enthält einen CALayer-backed NSView enthält. Ich habe versucht, all die üblichen Methoden zur Herstellung eines NSView in eine NSImage Erfassung (mit -dataWithPDFInsideRect, NSBitmapImageRep des -initWithFocusedViewRect, etc.) sind jedoch alle diese Verfahren behandeln die CALayer-backed NSView, als ob es nicht existiert. Ich habe schon gesehen, diese Stackoverflow Post, aber es war eine Frage über nur einen CALayer Baum auf ein Bild zu machen, nicht ein NSView sowohl regelmäßige NSView der und Schicht-backed Ansichten enthält.

Jede Hilfe ist willkommen, danke:)

War es hilfreich?

Lösung

Der einzige Weg, fand ich, dies zu tun, ist die CGWindow API, so etwas wie zu verwenden:

CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);

anklemmen dann den Teil dieser CGImage dass entspricht Ihre Ansicht mit

-imageByCroppingToRect.

Dann machen Sie eine NSImage aus dem beschnittenen CGImage. Denken Sie daran, dies wird nicht gut funktionieren, wenn Teile des Fensters offscreen sind.

Andere Tipps

Das funktioniert auf eine NSImage einen Blick direkt zu zeichnen, obwohl ich es nicht mit einer Schicht-backed Ansicht versucht habe:

NSImage * i = [[NSImage alloc] initWithSize:[view frame].size];
[i lockFocus];
if ([view lockFocusIfCanDrawInContext:[NSGraphicsContext currentContext]]) {
  [view displayRectIgnoringOpacity:[view frame] inContext:[NSGraphicsContext currentContext]];
  [view unlockFocus];
}
[i unlockFocus];

NSData * d = [i TIFFRepresentation];
[d writeToFile:@"/path/to/my/test.tiff" atomically:YES];
[i release];

Haben Sie sich die Vorschläge in der Cocoa Zeichnung Guide? ( "Erstellen einer Bitmap" )

Um direkt in eine Bitmap zu zeichnen, erstellen Sie ein neues NSBitmapImageRep Objekt mit den Parametern, die Sie mögen, und verwenden Sie die graphicsContextWithBitmapImageRep: Methode der NSGraphicsContext eine Zeichnung Kontext zu schaffen. Machen Sie den neuen Kontext den aktuellen Kontext und zeichnen. Diese Technik ist nur in Mac OS X 10.4 und höher verfügbar. Alternativ können Sie auch ein NSImage Objekt (oder ein Off-Screen-Fenster), ziehen hinein, erstellen und dann die Bildinhalte erfassen. Diese Technik ist in allen Versionen von Mac OS X unterstützt.

Das klingt ähnlich wie die iOS-Lösung Ich bin vertraut mit (mit UIGraphicsBeginImageContext und UIGraphicsGetImageFromCurrentImageContext), damit ich es an der Arbeit für Ihre Ansicht erwarten würde.

haben Sie einen Blick auf die Antwort auf diesen Beitrag: Wie kann ich einen Blick machen die Core Animation Schichten in eine Bitmap enthält?

Dieser Ansatz ist für mich unter ähnlichen Umständen zu Ihrem eigenen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top