web-dev-qa-db-fra.com

Accéder au répertoire 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 des chemins d'accès aux actifs du catalogue?

62
MobileVet

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

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

Il a été clairement documenté :

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

J'ai trouvé que dans le package de l'application compatible, un fichier nommé "Assets.car" est sorti, et je pense que ce sont les ensembles d'images complets de mon projet, et auraient dû être compressés.

Reportez-vous à la documentation Apple:

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

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

Alors c'est tout. 

Je cherche aussi un moyen de ne pas utiliser imageNamed:, je ne veux pas que le runtime cache mes images.

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

imgName: le nom du jeu d'images, sans se soucier du nom réel de l'image dans le jeu d'images.

11
Lyle

Je souhaitais accéder à des actifs vectoriels pour créer UNNotificationAttachment avec des ressources locales, alors j’ai proposé cette classe d’aide. Fondamentalement, il ne récupère que l'image des ressources, 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: 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
    }

}
10
tadija

Essayez d’utiliser le nom d’image défini à l’étape "Compiler le catalogue d’actifs". Vous le trouverez dans la sortie de la construction. Veillez à développer la transcription - vous devriez voir quelque chose comme ceci:

/* 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

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

2
Joshua C. Lerner

Bien qu'il existe un fichier Contents.json (voir ci-dessous) associé à chaque élément de xcassets contenant les noms de fichier 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 correspondant à 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 utiliser pathForResource en combinaison avec une fonction pour ajouter le suffixe approprié au nom de l'actif de base image de taille.

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

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

Exemple de fichier Contents.json pour l'élément 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"
  }
}
1
Craig LaHote

Pour les images de lancement et les icônes d'application en particulier, les chemins des images sont disponibles via les touches UILaunchImages et CFBundleIcons Info.plist respectivement. Il apparaît que ces images sont générées individuellement et que les valeurs Info.plist sont mises à jour lors de la création de l'application lors de l'utilisation de catalogues d'actifs (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 approprié à utiliser, mais les images sont disponibles séparément et vous pouvez éviter d'utiliser imageNamed dans ce cas.

0
Carl Lindberg