2012-07-11 158 views
2

我有一堆使用-[UIImage imageWithContentsOfFile:]和完整路徑的代碼的繼承項目。我正在將其轉換爲使用-[UIImage imageNamed:],只是文件名(無擴展名),所以我可以將它傳遞給@"icon",並根據情況獲得icon.png[email protected]icon~ipad.png如何確定 - [UIImage imageNamed:]將加載的文件的路徑?

問題是,在程序中有一部分我想檢查圖像的大小,如果它太大,我想顯示,而不是TooBigImage.png

所以我需要知道,如果我打電話給[UIImage imageNamed: someName],它將使用哪個擴展名/修飾名。基本上,我需要該文件的路徑,所以我可以在加載圖像之前檢查它的大小。或者,如果有方法檢查imageSizeForImageNamed:或類似的東西,我可以使用它,我只是不知道任何。 (a)笨重和(b)脆弱(如果蘋果改變/增強了這個功能,如果蘋果改變了/增加了這個功能,行爲?)

提示?

謝謝!

+0

當你說大小,你的意思是像素尺寸或以字節爲單位的大小? – idz 2012-07-11 21:40:03

+0

我不想踩腳趾,但是[UIImage imageNamed]'只能用於UI圖標圖像,因爲它將檢索到的圖像緩存在RAM中,這可能會導致內存問題(如果使用錯誤)。另一方面,'[UIImage imageWithContentsOfFile]'不會進行緩存,這對於較大的圖像是可取的。 – 2012-07-11 22:08:59

+0

@ids:要麼。 @Torsten:我相信你誤解了不使用'imageNamed'。系統緩存很好,早期iOSs的泄漏早已修復。 – Olie 2012-07-12 01:02:09

回答

0

對於像素使用sizescale屬性:

UIImage *getMySize = [UIImage imageNamed:@"blah"]; 

float width = getMySize.scale * getMySize.size.width; 

float height = getMySize.scale * getMySize.size.height; 

這裏是UIImage Documentation

+0

對。我想知道是否有一個解決方案給了我''imageNamed:'將要使用的文件的名稱,所以我可以檢查它的文件統計信息而不加載它。 – Olie 2012-07-12 01:05:58

+0

那麼,一旦你有像素大小,你應該能夠確定它正在返回哪個文件,除非你有多個文件名稱「blah * .png」,它們在你的主包中大小相同。當你對主包進行如此多的控制時,使用大小信息和回溯來找出它正在使用哪些文件應該不會太難。 – 2012-07-12 11:12:37

-1

據我所知,你應該實現自己的功能來手動檢查文件的大小。

您可以生成自己的名字,如:

-(bool)fileOk:(NSString*)filename 
{ 
    bool retina = [UIScreen mainScreen].scale == 2.0; 
    static bool iPad = UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad; 

    //Generate the filename 
    NSString *fullFilename = [NSString stringWithFormat:@"%@%@%@",filename,(retina)[email protected]"@2x":@"",(iPad)[email protected]"~ipad":@"~iphone"]; 

    //Get the size: 

    NSError *error; 
    NSString *fullPath=[[NSBundle mainBundle] pathForResource:fullFilename ofType:@"png"]; 
    NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath: fullPath error:&error]; 

    return (fileDictionary && [fileDictionary fileSize]<SOME_TO_BIG_SIZE_CONSTANT); 
} 

然後你可以選擇,如果你要顯示的圖像或沒有。我還沒有嘗試過的代碼,所以可能會有一些錯字...... 我希望,這是您要尋找的......

+0

這就是我在脆弱性問題中提到的問題。 (正如發佈的那樣,它也是bug,但我會把它作爲一個練習;) – Olie 2012-07-12 01:12:44

+0

我編輯過,所以它檢測文件是否存在。如果文件不存在,fileDictionary將爲零。我認爲你是一個非常容易解決的問題,因爲它很容易徘徊...... – 2012-07-12 10:35:47

-1

[UIImage imageNamed: @"icon"]看起來總是在應用主束。因此icon.png必須位於要找到的包中。在那裏不允許子路徑。

但是,您可以使用[NSBundle bundleWithPath: @"subfolder"]定義您自己的捆綁軟件,這裏的優點是您可以使用捆綁方法來檢索優化的資產。

NSBundle *bundle = [[NSBundle bundleWithPath: @"folder"] autorelease]; 

然後,[bundle pathForResource:ofType:]將您的文件夾返回正確的圖像資源的路徑(即圖標〜新iPad)和[UIImage imageWithContentsOfFile:]將採取大小改性劑護理。

雖然這個問題沒有答案,但它總結了我對這方面的經驗。 How do NSBundle pathForResource:ofType: and UIImage imageWithContentsOfFile: handle scale and device modifiers?

+0

是的,'imageNamed'總是在主包中查找,但它並不總是加載「icon.png」 - 這就是這個問題是關於:我可以確定將加載哪個文件? – Olie 2012-07-12 01:13:49

+0

它將加載最合適的資源。根據定義,該函數從包的根文件夾中加載具有給定名稱的png圖像。沒有辦法(我知道)也告訴這個函數加載另一個圖像。該功能雖然足夠聰明,可以加載iPhone/ipad和/或@ 2x圖像(如果存在)。 – 2012-07-12 14:47:57