2011-01-21 2 views
5

Я загружаю два изображения из Интернета Apple.png и [email protected] Я хочу использовать [UIImage imageNamed: @ "Apple.png"], чтобы он мог использовать встроенные функции, чтобы определить, должен ли он отображаться либо Apple.png, либо [email protected](iPhone) Используйте внешнее изображение в UIImage imageNamed

Где я могу хранить эти изображения? В документации я прочел следующее:

Название файла. Если это при загрузке изображения, то метод ищет изображение с указанным именем в главном комплекте приложения .

Ах, поэтому основной комплект приложения - это путь. Вот как выглядит мой код:

NSString  *directory = [[NSBundle mainBundle] bundlePath]; 
NSString  *path  = [directory stringByAppendingPathComponent:imageName]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

[fileManager createFileAtPath:path contents:dataFetcher.receivedData attributes:nil]; 

Я проверил, был ли файл создан в папке пути, и это было правильно. Я также перетащил Example.png в файл проекта только для того, чтобы убедиться, что он был сохранен в той же папке, и это также было правильно.

Однако [UIImage imageNamed: @ "Apple.png"] по-прежнему не удается получить изображения. У кого-нибудь есть идея?


Edit:

Я сделал категорию для UIImage:

@implementation UIImage (ImageNamedExtension)

+ (UIImage *)imageNamed:(NSString *)name fromDirectory:(NSString *)directory { 

    NSString  *name2x  = [name stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@", [name pathExtension]] withString:[NSString stringWithFormat:@"@2x.%@", [name pathExtension]]]; 
    NSString  *path  = [directory stringByAppendingPathComponent:name]; 
    NSString  *path2x  = [directory stringByAppendingPathComponent:name2x]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0) { 

     if ([fileManager fileExistsAtPath:path2x]) { 
      return [UIImage imageWithContentsOfFile:path2x]; 

     } 

    } 

    return ([fileManager fileExistsAtPath:path]) ? [UIImage imageWithContentsOfFile:path] : nil; 
} 

@end 

Это сделал трюк eventualy. Спасибо всем за помощь.

+0

+1 для форматирования кода. – WrightsCS

+0

Вы не можете создавать файлы в своем основном пакете на iPhone. Симулятор может позволить вам это сделать, но устройство не будет/не должно. Если вы загружаете, вам придется поместить его в другое место. –

+0

Ваша категория ломается, например, iPad (1-й ген), если используется только @ 2x (то есть 1x также потребуется). Вероятно, ломается и iPhone 3GS при тех же обстоятельствах. – Jonny

ответ

0

Созданы ли файлы с соответствующими разрешениями для доступа к ним? Вы не забыли закрыть файл после его сохранения?

2

Вы не можете использовать UIImage 'a +imageNamed: метод с изображениями, загружаемыми приложением. Этот метод действительно ищет изображения в комплекте приложений, но вашему приложению не разрешается изменять свой собственный пакет во время выполнения.

+0

Странно, я не получаю сообщение об ошибке, и FileManager говорит, что все в порядке. Но если UIImage imageNamed не работает для mainBundle. Есть ли альтернатива для получения правильного изображения? – Mark

+0

Ошибка или нет, это определенно не рекомендуется писать в комплект вашего приложения. См. Http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/RuntimeEnvironment/RuntimeEnvironment.html –

1

Загрузите изображения (асинхронно, конечно) в локальное хранилище вашего приложения (т. Е. Вашу песочницу) и укажите их локально. Затем вы можете использовать NSDocumentDirectory или NSCachesDirectory, чтобы всегда получать ссылку на их местоположение.

+0

Когда я храню изображения в NSDocumentDirectory, он также не будет работать. Я попробую NSCachesDirectory. – Mark

+0

Отрицательный. NSCachesDirectory также не работает. – Mark

+0

См. Ответ Йохана. Тем не менее, в то время как '+ imageNamed:' - приятное решение, не слишком сложно использовать масштаб [[UIScreen mainScreen]] == 2.0'. –

0

Вы не можете изменить свой комплект во время выполнения. Я также думаю, что imageNamed использует что-то вроде карты ресурсов, инициализированной в приложении, содержащем ссылки на ресурсы пакета.

Попробуйте вместо этого: http://atastypixel.com/blog/uiimage-resolution-independence-and-the-iphone-4s-retina-display/

Ciao!

0

Я думаю, что лучшим решением является создание в папке Library вашего собственного пакета, например. images.bundle. Там вы можете рисовать изображения для обоих разрешений. Чтобы получить доступ к этим изображениям, вы можете использовать pathForResource: ofType: метод класса NSBundle. Он возвращает соответствующие изображения. Затем инициализируйте изображение с возвращенным путем.

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error = nil; 
NSURL *libraryURL = [fileManager URLForDirectory:NSLibraryDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; 
if (libraryURL == nil) { 
    ALog(@"Could not access Library directory\n%@", [error localizedDescription]); 
} else { 
    NSURL *folderURL = [libraryURL URLByAppendingPathComponent:@"images.bundle"]; 
    DLog(@"Future bundle url = %@",folderURL); 
    if (![fileManager createDirectoryAtURL:folderURL withIntermediateDirectories:YES attributes:nil error:&error]) { 
     ALog(@"Could not create directory %@\n%@", [folderURL path], [error localizedDescription]); 
    } else{ 
     NSBundle *bundle = [NSBundle bundleWithURL:folderURL]; 
     // put image and [email protected] to the bundle; 
     [bundle pathForResource:yourImageName ofType:@"png"]; 
    } 
} 
Смежные вопросы