Доступ к каталогу активов pathForResource



выясняется, что:



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



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



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



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



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



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

542   6  

6 ответов:

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

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

Это было явно документирована:

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

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

см. документацию Apple:

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

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

Так вот оно что.

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

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

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

Я хотел получить доступ к некоторым векторным активам для создания 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
    }

}

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

/* 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/LaunchImage-700-Landscape@2x~ipad.png

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

хотя есть содержание.файл 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"];

Пример Содержание.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"
  }
}

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

Comments

    Ничего не найдено.