Доступ к каталогу ресурсов доступа к ресурсам

Похоже, что

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];

Не возвращает ничего для активов, находящихся в каталоге ресурсов Images.xcassets. Я также пробовал:

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images"];

[[NSBundle mainBundle] pathForResource:@"name" ofType:@"png" inDirectory:@"Images.xcassets"];

Но ни один из них не работал.

Кто-нибудь успел получить пути к активам в каталоге?

Ответ 1

Такая же проблема, но я не думаю, что мы могли бы получить доступ к ней через pathForResource:, за исключением ниже:

UIImage* image = [UIImage imageNamed:@"name-in-asset-catalog"];

Было ясно задокументировано:

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

Я обнаружил, что в пакете совместимого приложения появился файл с именем "Assets.car" , и я думаю, что все изображения установлены в моем проекте и должны были быть заархивированы или что-то еще.

Обратитесь к документации Apple:

Xcode 5 предоставляет различные функциональные возможности для каталогов активов в зависимости от о цели развертывания для вашего проекта:

  • Для всех проектов отдельные изображения могут быть загружены с использованием имен наборов.
  • Для проектов с целью развертывания iOS 7 Xcode компилирует ваш актив каталоги в формат двоичного файла времени выполнения, который уменьшает загрузку время для вашего приложения.

Так что это.

Я также ищу способ, который не использует imageNamed:, я не хочу, чтобы среда выполнения кэшировала мои изображения.

Ответ 2

[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], imgName]];

imgName: имя набора изображений, не заботясь об истинном имени изображения в наборе изображений.

Ответ 3

Я хотел получить доступ к некоторым векторным ресурсам для создания UNNotificationAttachment с локальными ресурсами, поэтому я придумал этот вспомогательный класс. Он в основном просто получает изображение из активов, сохраняет свои данные на диск и возвращает URL-адрес файла. Я надеюсь, что это поможет кому-то.

import UIKit

class AssetExtractor {

    static func createLocalUrl(forImageNamed name: String) -> URL? {

        let fileManager = FileManager.default
        let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
        let url = cacheDirectory.appendingPathComponent("\(name).png")

        guard fileManager.fileExists(atPath: url.path) else {
            guard
                let image = UIImage(named: name),
                let data = UIImagePNGRepresentation(image)
            else { return nil }

            fileManager.createFile(atPath: url.path, contents: data, attributes: nil)
            return url
        }

        return url
    }

}

Ответ 4

Попробуйте использовать имя изображения, как определено в разделе "Скомпилировать каталог активов". Вы найдете это в выводе сборки. Не забудьте расширить транскрипт - вы должны увидеть что-то вроде этого:

/* com.apple.actool.compilation-results */
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/[email protected]
/path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png
/path/to/Debug-iphonesimulator/Your.app/[email protected]~ipad.png

Протестировано с помощью +[UIImage imageNamed:] с Xcode 6.1.1.

Ответ 5

Несмотря на то, что имеется файл Contents.json(см. ниже), связанный с каждым элементом в xcassets, который содержит имена файлов этих изображений, он, похоже, не доступен на уровне файловой системы. Все изображения размещаются в одной папке файловой системы при компиляции. Файл json автоматически генерируется и не должен редактироваться, но он предоставляет шаблон для обхода.

Назовите каждый файл согласованным суффиксом, чтобы соответствовать соответствующей идиоме, шкале и подтипу, появляющимся в json файле. Для этого требуется ручная работа, выбрав опцию "Показать в Finder" для каждого актива и переименовав каждый файл, но после завершения вы можете использовать pathForResource в сочетании с функцией, чтобы добавить соответствующий суффикс к имени базового актива, чтобы получить соответствующее имя, размером.

Пример кода для извлечения пути:

NSString *imageName = @"Add to Cart";
NSString *imageSuffix = [self someMethodThatDeterminesSuffix]; // Example: "-iphone-2x-retina4"
NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", imageName, imageSuffix] ofType:@"png"];

Пример файла Contents.json для ресурса изображения "Добавить в корзину":

{
  "images" : [
    {
      "idiom" : "iphone",
      "scale" : "1x",
      "filename" : "Add to Cart-iphone-1x.png"
    },
    {
      "idiom" : "iphone",
      "scale" : "2x",
      "filename" : "Add to Cart-iphone-2x.png"
    },
    {
      "idiom" : "iphone",
      "filename" : "Add to Cart-iphone-2x-retina4.png",
      "subtype" : "retina4",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Ответ 6

Для изображений запуска и значков приложений, в частности, пути изображения доступны через ключи UILaunchImages и CFBundleIcons Info.plist соответственно. Кажется, что эти изображения генерируются индивидуально, а значения Info.plist обновляются во время сборки приложения при использовании каталогов активов (а если нет, эти ключи записываются непосредственно с помощью интерфейса Xcode). Возможно, вам придется написать какой-то код, чтобы найти правильный словарь для использования, но изображения доступны отдельно, и вы можете избежать использования imageNamed в этом случае.