Доступ к каталогу активов 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"];
но ни один из них не работал.
кто-нибудь имел успех, получение путей к активам в каталоге?
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