2013-05-10 43 views
2

我正在使用NSDrawNinePartImage()繪製可拉伸控件。由於這當然需要九個單獨的圖像來繪製這些部分(加上一些額外的東西),我有一個目錄充滿了像top-left.png[email protected]這樣的文件。我將這個目錄包含在我的應用程序包中作爲文件夾引用。從子目錄加載視網膜圖像

不幸的是,像-[NSImage imageNamed:]-[NSBundle imageForResource:]這樣的常見圖像加載API似乎不支持子目錄,即使您在名稱中加入了斜槓。相反,我加載圖像用這種方法:

- (NSImage*)popoverImage:(NSString*)name { 
    NSURL * url = [[NSBundle bundleForClass:self.class] URLForResource:name withExtension:@"png" subdirectory:@"popover"]; 
    return [[NSImage alloc] initWithContentsOfURL:url]; 
} 

也能正常工作正常顯示,但它忽略了2倍的圖像的Retina顯示屏。我怎樣才能讓它加載視網膜圖像呢?有沒有比分別加載兩個代表並手工合併更好的方法?我寧願不使用TIFF作爲這些資源的源文件,因爲我使用Acorn作爲圖像編輯器,而且最後一次檢查時,它並不真正瞭解像這樣的複合圖像格式。

回答

0

我最終咬住了子彈,並在運行時手動合併圖像。我這樣做是在上NSImage中一個類別添加此方法,然後在地方的-initWithContentsOfURL:使用它:

- (id)initRetinaImageWithContentsOfURL:(NSURL *)url { 
    if((self = [self initWithContentsOfURL:url])) { 
     NSURL * baseURL = url.URLByDeletingLastPathComponent; 
     NSString * baseName = url.lastPathComponent.stringByDeletingPathExtension; 
     NSString * extension = url.lastPathComponent.pathExtension; 

     NSString * retinaBaseName = [NSString stringWithFormat:@"%@@2x", baseName]; 
     NSURL * retinaURL = [baseURL URLByAppendingPathComponent:[retinaBaseName stringByAppendingPathExtension:extension]]; 

     if([retinaURL checkResourceIsReachableAndReturnError:NULL]) { 
      NSData * data = [[NSData alloc] initWithContentsOfURL:retinaURL]; 
      NSBitmapImageRep * rep = [[NSBitmapImageRep alloc] initWithData:data]; 

      rep.size = self.size; 
      [self addRepresentation:rep]; 
     } 
    } 

    return self; 
} 
0

簡單的答案是使用TIFF,你的擔心是錯位的。在Xcode中設置項目首選項「合併高分辨率圖稿」,並繼續像現在一樣使用Acorn生成您的兩個PNG。在構建過程中,Xcode會將這兩個PNG合併爲一個TIFF並將其存儲在您的包中。

+0

「合併高分辨率圖稿」似乎不影響文件夾引用。任何想法如何解決這個問題? – 2013-05-10 21:20:55

+0

@ BrentRoyal-Gordon - 對不起,我不知道你最好的答案。要看的東西包括:包括文件而不是文件夾(你仍然可以用Acorn編輯它們);使用構建階段腳本來合併和複製文件;並使用嵌套捆綁(添加一個捆綁子項目,把圖像放在那裏,讓Xcode構建並複製捆綁包 - 可能聽起來過分誇張,但捆綁只是一個文件夾,它只是讓Xcode生成文件夾的一種方式)。 HTH – CRD 2013-05-11 07:13:56

0

這是我做的:

NSArray *paths = [NSBundle.mainBundle pathsForResourcesOfType: @"icns" inDirectory: @"Collections/1"]; 

for (NSString *path in paths) { 
    NSString *fileName = [[path lastPathComponent] stringByDeletingPathExtension]; 
    NSImage *image = [[NSImage alloc] initWithContentsOfFile: path]; 
    image.name = fileName; 
    [iconCollectionController addObject: @{@"icon": image}]; 
} 

但作爲CRD已經指出的那樣,你需要結合你的作品(無論是作爲tiff或icns文件)。但它可以讓您免去手動選擇圖像分辨率的煩惱(這也需要您聽取後備存儲更改)。

相關問題