Wie können wir Assets Catalog Color Sets verwenden?

74

Normalerweise verwende ich benutzerdefinierte UIColors unter iOS mit Erweiterungen mit Swift, aber jetzt können wir mit iOS 11 / Xcode 9 Farbsätze erstellen. Wie können wir sie verwenden?

Update - Tipp

Wie @ Cœur sagt, können wir die Farbe per Drag & Drop verschieben und wie ein UIColor-Objekt verwenden. Eine mögliche Lösung könnte darin bestehen, sie als Erweiterung zu verwenden:

UIColor als Erweiterung

Oder als Konstante:

UIColor als Konstante

Jetzt möchte ich wissen, ob wir wie ein UIImage-Zugriff auf ein Asset-Image auf sie zugreifen können oder nicht.

UIImage(named: "image-name") -> UIColor(named: "color-name")
elGeekalpha
quelle

Antworten:

85
UIColor(named: "myColor") 

Quelle: WWDC 2017 Session 237 - Was ist neu in MapKit?


Vorsichtsmaßnahme: Das Bereitstellungsziel Ihres Projekts muss auf iOS 11.0 festgelegt sein.

user2421361
quelle
7
Dies erfordert das Bereitstellungsziel = 11.0.
Ricardo Mutti
46

(kurze Antwort auf das Frage-Update: gibt es UIColor(named: "MyColor")in Xcode 9.0)

Beantwortung der ursprünglichen Frage:

  1. Sie erstellen Ihr Farbset

Geben Sie hier die Bildbeschreibung ein

  1. Sie finden Ihre Farbe unter Ihren Schnipsel und ziehen sie per Drag & Drop

Geben Sie hier die Bildbeschreibung ein

  1. Beim Betrachten des Quellcodes wird es in ein Farbliteral übersetzt:

    #colorLiteral(red: 0, green: 0.6378085017, blue: 0.8846047521, alpha: 1)

Sie bemerken, wie unterschiedlich die Werte von Rot, Grün und Blau sind? Das liegt daran, dass ich sie Display P3im Farbraum definiert habe , aber das colorLiteral den Farbraum verwendet sRGB.

Cœur
quelle
1
@elGeekalpha Es ist eine schlechte Praxis, die Frage in eine andere zu bearbeiten. siehe meta.stackoverflow.com/questions/350309/… oder meta.stackexchange.com/questions/43478/…
Cœur
1
Ich habe die Frage nicht geändert, ich habe nur die gewünschte Implementierung besser spezifiziert: Wie kann ich sie verwenden, aber wie wir normalerweise Images Assets verwenden, ist Drag & Drop nur eine alternative Lösung. Entschuldigen Sie die Unannehmlichkeiten.
ElGeekalpha
4
Xcode wurde nicht hinzugefügt UIColor(named:), es ist Teil von UIKit, das ab iOS 11 in iOS integriert ist. Es scheint ein subtiler Punkt zu sein, aber es ist wichtig. Xcode kann UIKit keine Methoden hinzufügen.
Tom Harrington
28

In Xcode 11 drücken Sie Befehl + Umschalt + L, es öffnet sich ein Snippet, wählen Sie das letzte aus, wie ich es im Drag & Drop des Bildes gezeigt habe.

Geben Sie hier die Bildbeschreibung ein

Kishore Kumar
quelle
3
Ein großes Lob. Ich hätte nie gedacht, dieses Menü zu überprüfen.
Nathan Hosselton
2
Es ist eine gute Möglichkeit, Farbliteral hinzuzufügen, aber wenn wir die Farbe mithilfe der Assets ein wenig ändern müssen, wird die Änderung nicht in dem Code wiedergegeben, in den das Literal gezogen wurde. Daher suche ich immer noch nach Lösungen, die stattdessen den Asset-Namen verwenden und sich mit dem optionalen Rückgabetyp von UIColor befassen.
Kushal Ashok
Perfekte
Parth Patel
24

Kurzfassung

Fügen Sie einem Asset-Katalog einen Farbsatz hinzu, benennen Sie ihn und legen Sie Ihre Farbe im Attributinspektor fest. Rufen Sie ihn dann in Ihrem Code mit auf UIColor(named: "MyColor").

Vollständige Anweisungen

  1. Klicken Sie im Asset-Katalog-Viewer unten rechts im Hauptfenster auf die Plus-Schaltfläche und wählen Sie Neuer Farbsatz

    Neues Farbset-Menü

  2. Klicken Sie auf das weiße Quadrat und wählen Sie den Attributinspektor aus (Symbol ganz rechts im rechten Bereich).

  3. Von dort aus können Sie Ihre Farbe benennen und auswählen.

    Geben Sie hier die Bildbeschreibung ein

  4. Um es in Ihrem Code zu verwenden, rufen Sie es mit auf UIColor(named: "MyColor"). Dies gibt ein optionales Element zurück, sodass Sie es in den meisten Fällen auspacken müssen (dies ist wahrscheinlich einer der wenigen Fälle, in denen ein erzwungenes Auspacken akzeptabel ist, vorausgesetzt, Sie wissen, dass die Farbe in Ihrem Asset-Katalog vorhanden ist).

Robmathers
quelle
4
Dies erfordert das Bereitstellungsziel = 11.0.
Chintan Shah
8
Wie kann ich es in iOS <= 10
ffleandro
4
Gute Antwort. Ich wünschte, iOS würde diese Assets zu etwas machen, das Sie genauso kompilieren könnten wie Android mit R.color.myColor. Der neue Colors.xcassets-Ansatz ist definitiv besser, lässt jedoch die Tür für Laufzeitfehler offen, wenn Sie den Namen einer Farbe falsch eingeben, eine Farbe entfernen, ohne alle verwendeten Stellen zu finden usw. Scheint eher etwas zu sein, das zur Kompilierungszeit abgefangen werden sollte als zur Laufzeit einen Absturz verursachen (ich verstehe, dass Sie es als optional behandeln und nicht zwangsweise auspacken können, aber das erhöht die Komplexität ... also, worum ging es dann
?!
22

Sie müssen verwenden UIColor(named: "appBlue").

Außerdem können Sie in der UIColor-Erweiterung eine Funktion für den einfachen Zugriff erstellen.

enum AssetsColor {
   case yellow
   case black
   case blue
   case gray
   case green
   case lightGray
   case separatorColor
   case red
}

extension UIColor {

    static func appColor(_ name: AssetsColor) -> UIColor? {
        switch name {
        case .yellow:
            return UIColor(named: "appYellow")
        case .black:
            return UIColor(named: "appBlack")
        case .blue:
            return UIColor(named: "appBlue")
        case .gray:
            return UIColor(named: "appGray")
        case .lightGray:
            return UIColor(named: "appLightGray")
        case .red:
            return UIColor(named: "appRed")
        case .separatorColor:
            return UIColor(named: "appSeparatorColor")
        case .green:
            return UIColor(named: "appGreen") 
        }
    }
}

Sie können es so verwenden:

userNameTextField.textColor = UIColor.appColor(.gray)
Hitesh Agarwal
quelle
Mindest-SDKs sind: iOS 11.0+, Mac Catalyst 13.0+, tvOS 11.0+, watchOS 4.0
mgyky
1
Sie können einen Rohwert für hinzufügen enum AssetsColor: Stringund Namen als Rohwerte case yellow = "appYellow"switchUIColor(named: name.rawValue)
angeben
10

Sie können diese Methode für den einfachen Zugriff verwenden (Swift 4 & Swift 5).

enum AssetsColor: String {
    case backgroundGray
    case blue
    case colorAccent
    case colorPrimary
    case darkBlue
    case yellow
}

extension UIColor {
    static func appColor(_ name: AssetsColor) -> UIColor? {
         return UIColor(named: name.rawValue)
    }
}
Bola Ibrahim
quelle
8
 // iOS
 let color = UIColor(named: "SillyBlue")

 // macOS
 let color = NSColor(named: "SillyBlue")
Ashish
quelle
5
Diese URL hat nichts mit den Farben oder Farben des Asset-Katalogs oder iOS zu tun.
Tom Harrington
6

Bei Ihrer Frage, ob Sie mit Literal auf Farbressourcen wie das Bild zugreifen können colorliteral, können Sie ab Xcode 10.2 die Farbe auswählen, die Sie verwenden möchten, und zwar unter Ihrem Asset Manager.

Beispiel-Snippet

Muchicole
quelle
1
Hallo, tippe einfach color literal deinen Editor ein. Zum Beispiel: label.textColor = Farbliteral
Muchicole
0

Falls beim Laden von Farben in einem Swift-Paket eine Verzögerung auftritt, wenn Sie Folgendes verwenden UIColor(named:):

Die obigen Antworten gelten für ein reguläres Projekt. Wenn Sie jedoch Assets in einem schnellen Paket verwenden, kann es beim Laden der Farben zu einer Verzögerung beim Laden kommen UIColor(named: "example_name"). Wenn Sie eine UIColor(named: "background", in: Bundle.module, compatibleWith: .current)Überladung verwenden, die auf das Modul abzielt, werden die Farben sofort und ohne Verzögerung geladen.

Hinweis: Ich habe Erfahrung mit Xcode 12.1.

Tolgahan Arıkan
quelle