自 2021 年起,可以直接馈送CALayers
内容NSImage
,但您仍然可能会收到
[Utility] unsupported surface format: LA08
警告。经过几天的研究和测试,我发现如果您使用 backingLayer(又名 CALayer)创建了一个 NSView 并仅使用 anNSImage
来提供它的contents
. 仅此一项问题不大。但是如果你尝试通过 渲染它[self.layer renderInContext:ctx]
,每次渲染都会再次触发警告。
为了简单起见,我创建了一个 NSImage 扩展来解决这个问题。
@interface NSImage (LA08FIXExtension)
-(id)CGImageRefID;
@end
@implementation NSImage (LA08FIXExtension)
-(id)CGImageRefID {
NSSize size = [self size];
NSRect rect = NSMakeRect(0, 0, size.width, size.height);
CGImageRef ref = [self CGImageForProposedRect:&rect context:[NSGraphicsContext currentContext] hints:NULL];
return (__bridge id)ref;
}
@end
看看它是如何不直接返回 CGImageRef 而是桥接转换为id
..!这可以解决问题。
现在你可以像..
CALayer *somelayer = [CALayer layer];
somelayer.frame = ...
somelayer.contents = [NSImage imageWithName:@"SomeImage"].CGImageRefID;
PS:发布她是因为如果你也遇到这个问题,谷歌无论如何都会引导你到这个答案线程,以上所有答案都启发了我进行这个修复。