NSView zu NSImage: [self.layer renderInContext: ctx]; funktioniert nicht auf macOS High Sierra (10.13)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSView zu NSImage: [self.layer renderInContext: ctx]; funktioniert nicht auf macOS High Sierra (10.13)

    Ich habe diesen Code von dieser Seite in alten MacOS-Versionen verwendet, um ein Bild von einem NSView zu machen:

    Quellcode

    1. - (NSImage *)imageRepresentation
    2. {
    3. BOOL wasHidden = self.isHidden;
    4. CGFloat wantedLayer = self.wantsLayer;
    5. self.hidden = NO;
    6. self.wantsLayer = YES;
    7. NSImage *image = [[NSImage alloc] initWithSize:self.bounds.size];
    8. [image lockFocus];
    9. CGContextRef ctx = [NSGraphicsContext currentContext].graphicsPort;
    10. [self.layer renderInContext:ctx];
    11. [image unlockFocus];
    12. self.wantsLayer = wantedLayer;
    13. self.hidden = wasHidden;
    14. return image;
    15. }
    Alles anzeigen

    Es hat immer gut funktioniert.

    Nun, mit macOS High Sierra (10.13) ist das zurückgegebene Bild leer. Wie kann ich das Problem lösen?
  • Hallo MCDan, danke für deine Antwort.
    Ich habe es jetzt mit diesem Code getestet:

    Quellcode

    1. BOOL wasHidden = self.isHidden;
    2. BOOL wantedLayer = self.wantsLayer;
    3. self.hidden = NO;
    4. self.wantsLayer = YES;
    5. NSImage *image = [[NSImage alloc] initWithSize:self.bounds.size];
    6. [image lockFocus];
    7. CGContextRef ctx = [NSGraphicsContext currentContext].CGContext;
    8. [self.layer renderInContext:ctx];
    9. [image unlockFocus];
    10. self.wantsLayer = wantedLayer;
    11. self.hidden = wasHidden;
    12. return image;
    Alles anzeigen
    Das Bild bleibt leider leer.

    NSView:

    NSView.jpg

    NSImage:

    NSImage.jpg
  • Es werden die Subviews nicht gezeichnet. Bei mir hat die NSView die unsichtbare Farbe clearColor. Wenn ich die Farbe zum Beispiel auf rot ändere wird die View in das Bild gezeichnet. Die Subviews nicht.
  • Das hier funktioniert perfekt:

    Quellcode

    1. - (NSImage *)imageRepresentation
    2. {
    3. NSSize mySize = self.bounds.size;
    4. NSSize imgSize = NSMakeSize( mySize.width, mySize.height );
    5. NSBitmapImageRep *bir = [self bitmapImageRepForCachingDisplayInRect:[self bounds]];
    6. [bir setSize:imgSize];
    7. [self cacheDisplayInRect:[self bounds] toBitmapImageRep:bir];
    8. NSImage* image = [[NSImage alloc]initWithSize:imgSize] ;
    9. [image addRepresentation:bir];
    10. return image;
    11. }
    Alles anzeigen