Greifen Sie programmgesteuert auf den Asset-Katalog zu

96

Ich weiß, dass es sich um eine neue Funktion handelt, die möglicherweise nicht möglich ist. Ich würde jedoch gerne einen Asset-Katalog verwenden, um meine Assets zu organisieren, aber ich greife programmgesteuert auf alle meine Bilder zu. Wie würde ich jetzt auf meine Bilder zugreifen? Greife ich immer noch über ihre Dateinamen wie folgt auf sie zu:

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

Scheinbar verweist der Asset-Katalog nicht auf die Erweiterung. Wäre es also effizienter, ohne ".png" darauf zuzugreifen?

Der Grund, den ich frage, anstatt selbst zu testen, ist, dass ich auch nach dem Entfernen meiner Assets und des Asset-Katalogs und dem anschließenden Bereinigen des Build-Ordners auf meine Assets in meiner Anwendung zugreifen kann. Dies hindert mich daran, den Asset-Katalog zu testen, wenn ich ihn implementiere.

Nachdem ich den Asset-Katalog durchgesehen hatte, fand ich die "Contents.json" für jedes Asset und es ist wie folgt formatiert:

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

Ich bin mir immer noch nicht sicher, wie ich darauf zugreifen soll, aber vielleicht hilft das?

RileyE
quelle

Antworten:

138

Um über den Asset-Katalog auf das Image zugreifen zu können, müssen Sie nur ohne Erweiterungen auf den Namen der Asset-Gruppe zugreifen.

Wenn Sie @"[email protected]"dem Asset-Katalog ein Bild mit dem Namen hinzufügen , wird eine Asset-Gruppe mit dem Namen erstellt my-button.

Jetzt müssen Sie nur noch wie folgt auf das Bild zugreifen:

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

Sie können die Asset-Gruppe auch bearbeiten, indem Sie sie umbenennen (ohne die Bilder umzubenennen) oder die einzelnen Komponenten ändern. Auf diese Weise können Sie einfachere Namenskonventionen befolgen und völlig unterschiedliche Assets zwischen verschiedenen UIScreen scales ohne anzeigenscale Überprüfung anzeigen.

Um Bilder für verschiedene Gerätegrößen aufzunehmen, müssen Sie sie möglicherweise unter der Überschrift "Geräte" in den Optionen der Asset-Kataloggruppe umschalten. Hier ist ein Beispiel für diesen Umschalter (verfügbar durch Klicken mit der rechten Maustaste auf die Gruppe).

RileyE
quelle
R4-Versionen, dh 568-Unterstützung, sind vorhanden. Wenn Sie die Attribute eines Image-Sets anzeigen, können Sie in der Dropdown-
Liste
Gibt es eine Möglichkeit, programmgesteuert auf die Slicing-Informationen zuzugreifen? Neben dem Abrufen der Eigenschaft capInsets vom UIImage-Objekt?
Klaas
@Klaas Ich bin mir nicht sicher, warum Sie es auf andere Weise als das bekommen müssen UIImage. Und nach allem, was ich gesehen habe, nein, da jedes Kategoriebild in der Gruppe ein völlig anderes Bild sein kann, sind keine allgemeinen Informationen wie das Schneiden verfügbar. Oder fehlt mir etwas?
RileyE
@RileyE Ich muss einige Berechnungen für eine benutzerdefinierte Überlagerungsansicht durchführen und möchte dieselben Einfügungen verwenden. Wenn ich nur ein UIImage für meine Berechnungen erstellen muss, würde ich den benötigten Wert lieber woanders speichern (und redundant).
Klaas
1
Der Swift-Code scheint inUIImage(named: imageName)
HKTonyLee
26

Außerdem hat Apple mit Swift 3 eine neue Methode zum Abrufen von Bildern aus Assets hinzugefügt. Es wird als "Image Literal" bezeichnet und funktioniert wie folgt :

Bild wörtlich

Yigit Yilmaz
quelle
5

Schnell

Sie können einen Verweis auf ein Bild in Ihrem Asset-Catelog mit erhalten

UIImage(named: "myImageName")

Sie müssen die Erweiterung nicht einschließen.

Suragch
quelle
1

@ RileyE ist 100% richtig. Aus meinen Erfahrungen geht jedoch auch hervor, dass die Asset-Katalogreferenz für das Bild manchmal nachgestellte Leerzeichen enthalten kann. Sie werden es wahrscheinlich nicht bemerken, wenn Sie Storyboards / Xibs verwenden, da die automatische Vervollständigung dies hinzufügt. Wenn Sie jedoch aus dem Code darauf verweisen, ist das Problem nicht so offensichtlich.

AppHandwerker
quelle