为什么在NSView中使用大多数contentsGravity常量时会看到崩溃?

mar*_*ker 4 macos cocoa core-animation

我有一个NSView子类,并在initWithFrame方法中设置以下内容:

self.wantsLayer = YES;
self.layer.contents = [NSImage imageNamed:@"sprite-sheet"];
self.layer.contentsGravity = kCAGravityLeft;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了预期的视觉结果......以及以下日志崩溃:

**滥用NSImage和CALayer.contentsEravity被留下.它应该是resize,resizeAspect或resizeAspectFill之一.

为什么?文档中没有迹象表明不应使用其他值.

Dav*_*ist 6

实际上,您看到的行为是在文档中.它只是在NSImage文档中,而不是CALayer文档(由我强调):

将图像与CALayer对象一起使用

虽然您可以将NSImage对象直接分配给contentsCALayer对象的属性,但这样做可能并不总能产生最佳结果.您可以使用该layerContentsForContentsScale:方法获取可用于图层内容的对象,而不是使用图像对象.该方法创建的图像适合用作图层的内容,并支持所有图层的重力模式.相比之下,NSImage中类只支持kCAGravityResize,kCAGravityResizeAspect以及kCAGravityResizeAspectFill模式.