2012-06-25 60 views
7

問題:我有一個多頁TIFF圖像(用tiffutil生成),包含多個像素尺寸的圖像,從256x128像素到4096x2048像素。我想在CALayer中顯示此圖像,以便系統根據圖層的大小自動選擇圖像的最佳表示形式。目前,該層始終使用圖像的256x128表示,而不管其大小。CALayer自動縮放多頁TIFF NSImage

這是我做的:我

NSImage *image = [NSImage imageNamed:@"map-multipage.tiff"]; 

記錄的image對象加載圖像證實,它包含有不同的像素尺寸的多個交涉,但都表示是在點(256x128)的尺寸相同。 AFAIK這是蘋果公司推薦的多分辨率圖像的構建方式。

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" 
)> 

我然後直接分配NSImage實例的層的contents屬性:

self.layerView.layer.contents = image; 

如所提到的,其結果是,該層使用第一表示(256x128像素)來顯示圖像,而不管以點或像素爲單位的圖層大小。

當我將相同的圖像分配給NSImageView時,它按預期工作。圖像視圖根據其大小透明地選擇最佳圖像表示。我期望CALayer會以同樣的方式工作,但顯然情況並非如此。任何人都可以確認CALayer不支持這種自動選擇,或者我做錯了什麼? (注意,這個問題與HiDPI/Retina圖形沒有直接關係,事實上,如果我將圖層移動到HiDPI模式的顯示器上,它確實呈現得更清晰一點,表明它現在使用第二個位圖表示(512x256像素),這表明在HiDPI顯示器上選擇較高分辨率的自動機能夠工作,而最佳位圖表示的基本選擇失敗。)

+0

只是一個想法,嘗試去除'@「map-multipage.tiff''中的'.tiff'。另外,請確保'layerContentsRedrawPolicy'不是'Never'。或者,圖層的「內容重力」會影響內容的更新方式? – Stream

+1

@Stream:非常感謝您的建議。不,刪除文件擴展名不起作用,使用'layerContentsRedrawPolicy'或'contentsGravity'也​​沒有效果。在昨晚觀看了WWDC 2012會話245之後,我懷疑我的問題的答案是,它不以那種方式工作。看起來'CALayer'的'內容'不能以點/像素「知道」圖層實際大小的任何內容,因此無法根據此信息選擇位圖表示。 –

+0

有道理! ' - [CALayer內容]'只是一個位圖,太「愚蠢」瞭解它的來源。它是'CALayer',它依賴於'drawRect:inContext:'的表示。所以,當你直接設置'contents'時,它的尺寸必須基於當前的' - [NSImage size]'。 – Stream

回答

2

看起來像AppKit方法-[CALayer setContents:]選擇位圖表示大小匹配-[contents size]如果contents對象是NSImage。然後,選定的位圖按原樣使用,直到再次調用-[CALayer setContents:]