Accéder au catalogue de ressources pathForResource

Il semble que:

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

Ne renvoie rien pour les actifs figurant dans le catalogue d’actifs Images.xcassets. J’ai aussi essayé:

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

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

Mais ni l’un ni l’autre n’a fonctionné non plus.

Quelqu’un at-il réussi à récupérer les chemins d’access aux actifs dans le catalogue?

Même problème, mais je ne pense pas que nous puissions y accéder via pathForResource: sauf ci-dessous:

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

Il a été clairement documenté :

Chaque ensemble dans un catalogue d’actifs a un nom. Vous pouvez utiliser ce nom pour charger par programme toute image individuelle contenue dans l’ensemble. Pour charger une image, appelez la méthode UIImage: imageNamed: en transmettant le nom de l’ensemble contenant l’image.

J’ai trouvé que dans le package de l’application compatible, un fichier nommé “Assets.car” était sorti, et je pense que ce sont les images entières de mon projet, qui auraient dû être compressées.

Reportez-vous à la documentation d’Apple:

Xcode 5 fournit différentes fonctionnalités pour les catalogues d’actifs en fonction de la cible de déploiement de votre projet:

  • Pour tous les projets, des images individuelles peuvent être chargées à l’aide de noms de set.
  • Pour les projets avec une cible de déploiement d’iOS 7, Xcode comstack vos catalogues d’actifs dans un format de fichier binary d’exécution qui réduit le temps de téléchargement de votre application.

Alors c’est tout.

Je cherche également un moyen qui n’utilise pas imageNamed: je ne veux pas que le runtime cache mes images.

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

imgName: le nom de l’image définie, sans tenir compte du vrai nom de l’image dans l’image définie.

Je voulais accéder à certains éléments vectoriels pour créer UNNotificationAttachment avec des ressources locales, et j’ai donc trouvé cette classe d’assistance. Il récupère simplement l’image des actifs, enregistre ses données sur le disque et renvoie l’URL du fichier. J’espère que cela aide quelqu’un.

 import UIKit class AssetExtractor { static func createLocalUrl(forImageNamed name: Ssortingng) -> 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, atsortingbutes: nil) return url } return url } } 

Essayez d’utiliser le nom de l’image comme indiqué dans l’étape “Comstackr le catalogue des ressources”. Vous trouverez cela dans la sortie de compilation. Assurez-vous d’élargir la transcription – vous devriez voir quelque chose comme ceci:

 /* com.apple.actool.compilation-results */ /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-Portrait-736h@3x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-800-667h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-568h@2x.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape~ipad.png /path/to/Debug-iphonesimulator/Your.app/LaunchImage-700-Landscape@2x~ipad.png 

Testé avec +[UIImage imageNamed:] avec Xcode 6.1.1.

Bien qu’il existe un fichier Contents.json (voir ci-dessous) associé à chaque élément de xcassets contenant les noms de fichiers des images de cet élément, il ne semble pas être accessible au niveau du système de fichiers. Toutes les images sont placées dans un seul dossier de système de fichiers lors de la compilation. Le fichier json est généré automatiquement et ne doit pas être modifié, mais il fournit un modèle pour une solution de contournement.

Nommez chaque fichier avec un suffixe cohérent pour correspondre à l’idiome, à l’échelle et au sous-type correspondants apparaissant dans le fichier json. Cela nécessite un travail manuel en sélectionnant l’option «Afficher dans le Finder» pour chaque actif et en renommant chaque fichier, mais une fois terminé, vous pouvez ensuite utiliser pathForResource en combinaison avec une fonction pour append le suffixe approprié au nom de base de la ressource pour récupérer le fichier approprié. image de taille.

Exemple de code pour récupérer le chemin:

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

Exemple de fichier Contents.json pour la ressource d’image “Ajouter au panier”:

 { "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" } } 

Pour les images de lancement et les icons d’application en particulier, les chemins d’image sont disponibles via les clés UILaunchImages et CFBundleIcons Info.plist respectivement. Il apparaît que ces images sont générées individuellement et que les valeurs Info.plist mises à jour lors de la création de l’application lors de l’utilisation de catalogues d’actifs (et sinon, ces clés sont écrites directement par l’interface utilisateur Xcode). Vous devrez peut-être écrire du code pour déterminer le sous-dictionnaire à utiliser, mais les images sont disponibles séparément et vous pouvez éviter d’utiliser imageNamed dans ce cas.