Использование NSView на уровне слоя в качестве NSViewckTile - PullRequest
2 голосов
/ 09 февраля 2012

Есть ли способ использовать слой с подложкой NSView в качестве contentView для NSDockTile? Перепробовал всевозможные трюки, но все, что я получил, это прозрачная область. Также попытался пойти другим путем и получить изображение из CALayer и использовать его для [NSApp setApplicationIconImage:], но тоже не повезло - я думаю, что проблема здесь заключается в создании представления изображения для изображения вне экрана.

1 Ответ

2 голосов
/ 10 февраля 2012

Как обычно, я получил свой ответ вскоре после публикации вопроса :) Я опубликую его здесь для справки в будущем: я решил это, создав NSImage из слоя, как описано в Какао - моя запись в блоге моей девушки здесь http://www.cimgf.com/2009/02/03/record-your-core-animation-animation/

Единственный недостающий фрагмент - это то, что для того, чтобы что-то отображалось, в окно необходимо добавить представление, поэтому, используя пример кода из поста, мое решение:

NSView *myView = ...
NSWindow *window = [[NSWindow alloc] initWithContentRect:NSMakeRect(-1000.0, -1000.0, 256.0, 256.0) styleMask:0 backing:NSBackingStoreNonretained defer:NO];
[window setContentView:myView];

NSUInteger pixelsHigh = myView.bounds.size.height;
NSUInteger pixelsWide = myView.bounds.size.width;
NSUInteger bitmapBytesPerRow = pixelsWide * 4;
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef context = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);

[myView.layer.presentationLayer renderInContext:context];
CGImageRef image = CGBitmapContextCreateImage(context);
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image];
CFRelease(image);

NSImage *img = [[NSImage alloc] initWithData:[bitmap TIFFRepresentation]];
[NSApp setApplicationIconImage:img];
...