JPG изображение не загружается с UIImage imageNamed

Я прочитал по ссылке, что с iOS версии 4.+ с методом imageNamed из UIImage объект, расширение файла не требуется.

От UIImage ссылка на класс:

Особые соображения.

В iOS 4 и более поздних версиях имя файла не обязательно для указания расширения имени файла. До iOS 4 необходимо указать расширение имени файла.

Но похоже, что это работает только с файлами PNG.

Если мой код:

[UIImage imageNamed:@"test"];
  • Изображение загружается только если файл test.png
  • Изображение не загружается, если оно test.jpg,

Для меня это большая проблема, потому что мне нужно поддерживать динамическую загрузку изображения (я не знаю во время выполнения, является ли изображение, которое я хочу загрузить, png или же jpg).

Не могли бы вы мне помочь пожалуйста?
Благодарю.

2 ответа

В последнем справочнике разработчика говорится о недостающей части информации:

Особые замечания В iOS 4 и более поздних версиях, если файл в формате PNG, указывать расширение имени файла.PNG не обязательно. До iOS 4 необходимо указать расширение имени файла.

Одна из возможных причин, по которой библиотека обеспечивает особый подход к PNG, заключается в том, что аппаратное обеспечение iOS оптимизировано для PNG. Изображения PNG, хранящиеся в комплекте приложений, оптимизируются с помощью Xcode, изменяя порядок байтов изображений PNG в соответствии с графическим чипом устройства iPhone. (см. этот вопрос: предпочитают ли PNG JPEG для всех файлов изображений на iOS?).

Если вы знаете, что у вас будет только PNG или JPG, альтернативное решение - создать категорию на UIImage, как показано ниже.

- (UIImage*) jgcLoadPNGorJPGImageWithName:(NSString*)name {
    UIImage * value;
    if (nil != name) {
        value = [UIImage imageNamed:name];
        if (nil == value) {
            NSString * jpgName = [NSString stringWithFormat:@"%@.jpg", name];
            value = [UIImage imageNamed:jpgName];
        }
    }
    return value;
}

Если у вас есть эти изображения в вашем приложении, вы ДОЛЖНЫ знать их расширения.

Если вы получаете их из онлайн-источника и используете их как NSData, вы можете использовать этот код здесь, чтобы определить тип.

+ (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];

    switch (c) {
    case 0xFF:
        return @"image/jpeg";
    case 0x89:
        return @"image/png";
    case 0x47:
        return @"image/gif";
    case 0x49:
    case 0x4D:
        return @"image/tiff";
    }
    return nil;
}

Согласно верхнему ответу в этом вопросе.

Другие вопросы по тегам