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?
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:
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.
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.
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!
-> paramètres de construction -> COMBINE_HIDPI_IMAGES à NO
c'est la seule solution qui fonctionne et aucun autre changement n'est nécessaire
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:
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];