Использовать внешнее изображение в UIImage imageNamed - PullRequest
5 голосов
/ 21 января 2011

Я загружаю два изображения из сети Apple.png и Apple@2x.png.Я хочу использовать [UIImage imageNamed:@"Apple.png"], чтобы он мог использовать встроенные функции, чтобы определить, должен ли он отображать Apple.png или Apple@2x.png.

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

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

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

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"] по-прежнему не удается получить изображения.

Ответы [ 6 ]

2 голосов
/ 21 января 2011

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

1 голос
/ 21 января 2011

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

0 голосов
/ 12 марта 2018

Решение по ОП.

Категория для UIImage:

@implementation UIImage (ImageNamedExtension)

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

    if ([UIScreen mainScreen].scale >= 3.0) {
        NSString *path3x = [directory stringByAppendingPathComponent:[[name stringByDeletingPathExtension] stringByAppendingFormat:@"@3x.%@", name.pathExtension]];
        UIImage *image = [UIImage imageWithContentsOfFile:path3x];
        if (image) {
            return image;
        }
    }
    if ([UIScreen mainScreen].scale >= 2.0) {
        NSString *path2x = [directory stringByAppendingPathComponent:[[name stringByDeletingPathExtension] stringByAppendingFormat:@"@2x.%@", name.pathExtension]];
        UIImage *image = [UIImage imageWithContentsOfFile:path2x];
        if (image) {
            return image;
        }
    }
    NSString *path = [directory stringByAppendingPathComponent:name];
    return [UIImage imageWithContentsOfFile:path];
}

@end
0 голосов
/ 18 сентября 2012

Я думаю, что лучшее решение - создать в папке 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 image@2x to the bundle;
        [bundle pathForResource:yourImageName ofType:@"png"];
    }
}
0 голосов
/ 21 января 2011

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

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

Ciao!

0 голосов
/ 21 января 2011

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

...