David Ansermot richtig, dass xcassets ist ein viel besserer Ansatz und stark bevorzugt. Wenn Sie das nicht verwenden können (z. B. bei älteren iOS-Versionen), legen Sie alles in ein Verzeichnis und verwenden Sie imageNamed:
. Dies hat erhebliche Vorteile beim Caching gegenüber dem manuellen Laden der Datei.
Ein asset catalog (xcassets) ist eine (relativ) neue, einheitliche Art der Verwaltung von Bildressourcen. Auf die Bilder kann nicht mehr als separate Datei auf der Festplatte zugegriffen werden. Stattdessen ruft imageNamed:
den Asset-Katalog ab und ruft das richtige Asset ab.
Vor Asset-Katalogen (und immer noch für Nicht-Images) wurden Assets in lokalisierten Verzeichnissen gespeichert. Alle nicht lokalisierten Assets werden in ein Verzeichnis mit dem Namen Resources
gestellt (unabhängig davon, wo diese Dateien in Ihrem Quellbaum erscheinen und unabhängig davon, wie diese Dateien in Ihren Xcode-Ordnern angeordnet sind). Lokalisierte Dateien würden in Verzeichnissen wie English.lproj
oder French.lproj
gespeichert werden. Wenn Sie NSBundle
Aufrufe zum Laden MyImage
aufrufen, wird jedes lokalisierte Verzeichnis in der vom Benutzer konfigurierten Reihenfolge betrachtet. Wenn es in einem dieser Verzeichnisse nicht gefunden werden kann, wird Resources
angezeigt.
Jetzt ist es möglich, vollständige Verzeichnisse als "Ressource" zu speichern, indem Sie sie als Verzeichnisreferenzen in Xcode markieren. In diesem Fall wird das gesamte Verzeichnis in Resources
oder das entsprechende lokalisierte Verzeichnis kopiert. Um Dateien in einem solchen Verzeichnis zu finden, können Sie die ...inDirectory:
Version der NSBundle
Methoden verwenden. Also die meiste Zeit, Sie wollen nur imageNamed:
verwenden, die Dinge aus dem Asset-Katalog zu holen, wenn verfügbar ist, und suchen Sie lokalisierte Verzeichnisse, und dann in Resources
suchen.Wenn Sie ein Nicht-Bild finden müssen, oder wenn Sie aus irgendeinem Grund den realen Pfad zur Datei möchten, können Sie es wie folgt berechnen:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon" ofType:@"png"];
Und wenn die Ressource waren in einem Verzeichnisbaum (weil es war in Xcode ein Verzeichnis Referenz), können Sie es wie folgt zugreifen können:
NSString *path = [[NSBundle mainBundle] pathForResource:@"MSB_big_icon"
ofType:@"png"
inDirectory:@"Raymio_android_images/MSB_big_icon.imageset"];
vielleicht krank muss nur auf den Standard gehen, mit einem Nerv in meinem Hinterkopf, dass ich das nicht zur Arbeit bekommen. Ist es falsch zu verstehen, dass, wenn etwas unter den Ressourcen des Kopierpakets aufgeführt wird, der aufgelistete Ordner zum Bundle hinzugefügt wird und dann über NSBundle verwendet werden kann? Die Verwendung des letzten Code-Snippets funktioniert nicht, obwohl sich images.xcassets im Kopierpaket befinden. Liste. – DevilInDisguise
Wenn Sie eine Datei in Kopienpaket-Ressourcen einfügen, befindet sie sich im Stammordner. Alle darüber liegenden Unterverzeichnisse werden entfernt. Wenn Sie Verzeichnisse behalten wollen, müssen Sie das Verzeichnis selbst kopieren (und wie ich mich erinnere, es ist eine Weile her), müssen Sie das Verzeichnis eine "Verzeichnisreferenz" anstelle eines "Ordners" machen. –
Aber wieso würde Xcode daran scheitern, bereits Dateien und images.xcassets hinzuzufügen, um Bundle-Ressourcen zu kopieren, da es bereits im Stammordner ist, und andererseits gibt es verschiedene Ordner/Dateien im Stammordner, die nicht im Bundle sind. Aus deinem Kommentar klingt es wie Kopierbündel-Ressource ist mehr, wenn du einen Ordner außerhalb deines Apps-Stammordners zur App hinzufügen musst, oder? Wie auch immer, ich bin immer noch ein wenig verwirrt darüber, warum dieser Ansatz immer noch nicht funktioniert. – DevilInDisguise