Доступ к каталогу ресурсов доступа к ресурсам
Похоже, что
[[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 в этом случае.