Ole*_*ann 7 macos cocoa objective-c calayer nsimage
问题:我有一个多页TIFF图像(使用tiffutil生成),它包含多个像素尺寸的相同图像,从256x128像素一直到4096x2048像素.我希望将此图像显示在一起,CALayer以便系统根据图层的大小自动选择图像的最佳表示.目前,无论图像大小如何,图层始终使用图像的256x128表示.
这是我的工作:我加载图像
NSImage *image = [NSImage imageNamed:@"map-multipage.tiff"];
Run Code Online (Sandbox Code Playgroud)
记录image对象确认它包含多个具有不同像素大小的表示,但所有表示的大小都相同(256x128).AFAIK这就是Apple推荐构建多分辨率图像的方式.
NSLog(@"%@", image);
<NSImage 0x100623060 Name=map-multipage Size={256, 128} Reps=(
"NSBitmapImageRep 0x10064d330 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=256x128 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0",
"NSBitmapImageRep 0x10064e1b0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=512x256 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0",
...
"NSBitmapImageRep 0x100530bd0 Size={256, 128} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=4096x2048 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x10014fdb0"
)>
Run Code Online (Sandbox Code Playgroud)
然后我将NSImage实例直接分配给图层的contents属性:
self.layerView.layer.contents = image;
Run Code Online (Sandbox Code Playgroud)
如上所述,结果是图层使用第一个表示(256x128像素)来显示图像,而不管图层的点或像素大小.
当我将相同的图像分配给a时NSImageView,它按预期工作.图像视图根据其大小透明地选择最佳图像表示.我希望这CALayer会以同样的方式工作,但显然事实并非如此.任何人都可以确认CALayer不支持这种自动选择还是我做错了什么?
(请注意,这个问题与HiDPI/Retina图形没有直接关系.事实上,如果我将图层移动到HiDPI模式的显示器,它会渲染得更清晰,表明它现在使用第二个位图表示(512x256像素)这表明,在最佳位图表示的基本选择失败的情况下,在HiDPI显示器上选择更高分辨率的自动化是有效的.)
看起来 AppKit 方法-[CALayer setContents:]会选择大小匹配的位图表示-[contents size](如果contents对象是 )NSImage。然后按原样使用所选位图,直到-[CALayer setContents:]再次调用。
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |