Accéder au catalogue d'actifs par programmation

96

Je sais que c'est une nouvelle fonctionnalité et que cela n'est peut-être pas possible, mais j'aimerais pouvoir utiliser un catalogue d'actifs pour organiser mes actifs, mais j'accède à toutes mes images par programmation. Comment accéder à mes images maintenant? Dois-je toujours y accéder par leurs noms de fichiers comme ceci:

[UIImage imageNamed:@"my-asset-name.png"];

Apparemment, le catalogue de ressources ne fait pas référence à l'extension, alors serait-il plus efficace d'y accéder sans le ".png"?

La raison pour laquelle je demande au lieu de tester par moi-même est que même après avoir supprimé mes actifs et mon catalogue d'actifs, puis nettoyé le dossier de construction, je peux toujours accéder à mes actifs dans mon application. Cela m'empêche de tester le catalogue d'actifs lorsque je l'implémente.

Après avoir parcouru le catalogue d'actifs, j'ai trouvé le "Contents.json" pour chaque actif et il est formaté comme suit:

{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x",
      "filename" : "[email protected]"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Je ne sais toujours pas comment je devrais y accéder, mais peut-être que cela aidera?

RileyE
la source

Réponses:

138

Pour accéder à l'image à partir du catalogue d'actifs, il vous suffit d'accéder au nom du groupe d'actifs sans aucune extension.

Ainsi, si vous ajoutez une image nommée @"[email protected]"au catalogue d'actifs, il créera un groupe d'actifs appelé my-button.

Maintenant, il ne vous reste plus qu'à accéder à l'image comme ceci:

// Objective-C
[UIImage imageNamed:@"my-button"];
// Swift
UIImage(named: "my-button")

En outre, vous pouvez modifier le groupe de ressources en le renommant (sans renommer les images) ou en modifiant ses composants individuels. Cela vous permettra de suivre des conventions de dénomination plus simples et d'afficher des actifs complètement différents entre différents UIScreen scales sans aucune scalevérification.

Afin d'incorporer des images pour différentes tailles de périphérique, vous devrez peut-être le basculer sous le sous-titre "Périphériques" dans les options du groupe de catalogue d'actifs. Voici un exemple de cette bascule (disponible en cliquant avec le bouton droit sur le groupe).

RileyE
la source
Les versions R4, c'est-à-dire le support 568, sont là. Si vous affichez les attributs d'un ensemble d'images, vous pouvez sélectionner `` Spécifique à l'appareil '' dans la liste déroulante Appareils, puis vous pouvez ajouter une image R4, qui apparaîtra sur les appareils de 4 po exécutant iOS 7.
bandejapaisa
Existe-t-il un moyen d'accéder par programme aux informations de découpage? En plus d'obtenir la propriété capInsets de l'objet UIImage?
Klaas
@Klaas Je ne sais pas pourquoi vous auriez besoin de l'obtenir par un autre moyen que le UIImage. Et d'après ce que j'ai vu, non, car chaque image de catégorie dans le groupe peut être une image complètement différente, il n'y aura donc pas d'informations générales, comme le découpage, disponibles. Ou est-ce que je manque quelque chose?
RileyE
@RileyE J'ai besoin de faire quelques calculs pour une vue de superposition personnalisée et j'aimerais utiliser les mêmes encarts. Lorsque je dois uniquement créer une UIImage pour mes calculs, je préfère stocker la valeur nécessaire ailleurs (et redondante).
Klaas
1
Le code Swift semble être changé enUIImage(named: imageName)
HKTonyLee
26

Apple a également ajouté une nouvelle façon d'obtenir une image à partir d'actifs avec Swift 3, il s'appelle `` Image Literal '' et fonctionne comme ci-dessous:

Littéral d'image

Yigit Yilmaz
la source
5

Rapide

Vous pouvez obtenir une référence à une image dans votre catalogue d'actifs avec

UIImage(named: "myImageName")

Vous n'avez pas besoin d'inclure l'extension.

Suragch
la source
1

@RileyE a raison à 100%. Cependant, d'après mes expériences, il convient également de noter que parfois la référence du catalogue d'actifs pour l'image peut contenir un espace blanc de fin. Vous ne remarquerez probablement pas si l'utilisation de storyboards / xibs car la complétion automatique l'ajoutera. Mais quand vous le référencez à partir du code, le problème n'est pas si évident.

AppHandwerker
la source