web-dev-qa-db-fra.com

Ressources d'images pour iOS

Il me manque probablement quelque chose d'évident ici, mais je n'ai pas pu résoudre le problème suivant:

J'ai un projet avec des ressources d'image pour les écrans normaux et rétiniens, comme someimage.png et [email protected], qui sont stockés dans un bundle séparé. Lorsque je crée le projet, Xcode les regroupe automatiquement dans un tiff multipage unique (imageName.tiff), Je l'ai vérifié dans le Finder - c'est en fait un tiff multipage avec les deux images. Cependant, voici un problème: j'ai du mal à charger les ressources appropriées.

Ce que je fais c'est:

    NSString * imageName = ... ;

    NSLog(@"imageName: %@", imageName);

    UIImage * someImage = [UIImage imageNamed: imageName];

Je préfère également la méthode auxiliaire, qui renvoie un ensemble de ressources:

   +(NSBundle *) resourcesBundle
   {
         NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"MyResourcesBundle" withExtension:@"bundle"]];
         return bundle;
   }

J'ai essayé de suivre pour imageName:

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"png"];

dans ce cas, j'ai null pour imageName.

imageName = [[AuxClass resourcesBundle] pathForResource:@"someimage" ofType:@"tiff"];

dans ce cas, le chemin de l'image actuall est retourné, mais cela ne fonctionne que si j'utilise imageWithContentsOfFile au lieu de imageNamed, et il ne prend pas la ressource appropriée: il charge la ressource pour la rétine malgré le type d'écran .

Si j'oublie le type de fichier (comme je l'ai fait avant d'ajouter @2x ressources, et cela a bien fonctionné, et c'était la première chose que j'ai essayé et j'étais sûr que cela fonctionnerait)

imageName = [NSString stringWithFormat: @"%@/%@",
                                  @"MyResourcesBundle.bundle"",
                                  @"someimage" ];

rien n'est chargé.

L'ajout de l'extension ".tiff" a le même effet que pathForResource: - la ressource pour la rétine est chargée, sans tenir compte de la ressource pour l'écran sans rétine.

Alors qu'est-ce qui me manque? Quelle est la bonne façon de charger des images?

28
Vladimir

Avez-vous essayé de simplement charger l'image en utilisant:

UIImage * someImage = [UIImage imageNamed: @"someimage"];

(en supposant que vous ayez une image nommée 'someimage' dans votre projet, par exemple someimage.png)

Le code choisira automatiquement les versions rétine/non-rétine selon la plate-forme.

Si le problème est que le TIFF est créé, vérifiez:

XCode Combine high-resolution artwork

Dans la dernière version de XCode, allez dans le menu Éditeur, puis sélectionnez "valider les paramètres", ce qui devrait supprimer cette combinaison d'illustrations.

46
Resh32

Les TIFF multipages sont uniquement pour OSX; ils ne fonctionnent pas sur iOS.

Vous devez donc cesser d'essayer d'accéder à des ressources qui, de par leur nature même, sont inaccessibles et faire les choses correctement!

Vous devez ouvrir le projet qui génère le bundle de ressources externes , sélectionner la cible, accéder aux paramètres de génération, puis au sous-titre Déploiement et définir " Combiner des illustrations haute résolution "à Non. Ensuite, recompilez le groupe de ressources externes.

Dans votre projet principal, vous devriez maintenant pouvoir lire les PNG de manière normale.

11
Wildaker

Si vous travaillez avec des bundles, rendez-vous sur

-> paramètres de construction -> COMBINE_HIDPI_IMAGES à NO,

et il vous suffit de nettoyer et de construire!

8
casero

-> paramètres de construction -> COMBINE_HIDPI_IMAGES à NO

c'est la seule solution qui fonctionne et aucun autre changement n'est nécessaire

2
user2587835

Lorsque vous créez des images pour votre application, supposons que vous créez une image appelée example.

Vous devez enregistrer les éléments suivants:

  • exemple ~ iphone.png -> c'est pour iPhone sans rétine
  • [email protected] -> c'est pour l'iPhone rétine
  • exemple ~ ipad.png -> c'est pour iPad non rétine
  • [email protected] -> c'est pour la rétine iPad

Donc, peu importe d'où vous l'appelez, vous l'appelez simplement de cette façon, en supposant que myImageView est un objet UIImageView:

[myImageView setImage:[UIImage imageNamed:@"example"]];

Apple vous recommande fortement d'utiliser des images png. En outre, le système d'exploitation prend soin de trouver l'image correcte pour l'appareil souhaité. Vous n'avez pas à vous soucier de trouver le chemin et tout ça. +(UIImage*)imageNamed:(NSString*)name recherche l'image correcte dans votre bundle de ressources - et au fait, pour renvoyer le bundle avec vos ressources, appelez simplement [NSBundle mainBundle];

1
Natan R.