Wie kann ich die standardmäßige blaue Farbe für iOS 7 programmgesteuert ermitteln?

223

Ich erstelle benutzerdefinierte Elemente in meiner App und möchte das Erscheinungsbild des neuen iOS anpassen. iOS 7 hat uns eine sehr häufige hellblaue Farbe eingeführt, die Standardfarbe oder -tönung für mehrere Elemente, einschließlich der Systemschaltfläche, der segmentierten Steuerung usw. Sie haben die Auswahl der Farbe mithilfe von IB vereinfacht, wie hier dargestellt:

Geben Sie hier die Bildbeschreibung ein

Ich habe jedoch nicht herausgefunden, wie ich programmgesteuert einfach auf die Farbe zugreifen kann. Ich habe die UIColor-Dokumentation überprüft , und es scheint keinen Accessor für die blaue Systemfarbe in der Klasse selbst zu geben.

Hier ist meine Frage: Gibt es für diese Farbe einen einfachen Accessor? [UIColor ?]oder so ähnlich? Wenn nicht, kennt jemand die genauen RGB-Werte für diese Farbe?

Joel H.
quelle

Antworten:

252

Verwendung self.view.tintColorvon einem View Controller oder self.tintColorvon einer UIViewUnterklasse.

Aaron Brager
quelle
6
Ich wollte sagen, dass Sie nur verwenden können UIView().tintColor, aber in der Tat können Sie nicht. Ich bin mir nicht sicher, zu welchem ​​Zeitpunkt die UIView den Farbton erhält ...
Dan Rosenstark
1
@ DanRosenstark Ich denke, die UIWindowoder vielleicht seine Root-Ansicht hat die Originalversion. Ansichten erben ihre Farbtonfarbe von höheren Ansichten in der Responderkette, aber in Ihrem Beispiel hat die neue Ansicht keine Übersicht.
Aaron Brager
2
self.view.tintColorvon innen UIViewController.viewDidLoad()ergibt sich das rechte blau.
Nicolas Miari
234

Es scheint zu sein [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

Screenshot mit dem Fenster Farben

Greg
quelle
2
Interessanterweise scheint das Standardblau auf meinem System 0: 128: 255 zu sein (mit demselben Tool). Ich frage mich, ob Apple es kürzlich geändert hat.
Joel H.
@ JoelH. Überprüfen Sie den aktuell verwendeten Farbraum.
Richard J. Ross III
19
Seien Sie vorsichtig, wie Sie dies verwenden, da es sich in späteren iOS-Versionen ändern kann.
Zev Eisenberg
7
Ja, definitiv keine gute Idee, einen Wert fest zu codieren, der sich möglicherweise ändern könnte. Insbesondere, wenn eine API zum Abfragen des tatsächlichen Werts vorhanden ist.
Nicolas Miari
1
Schnelle VersionUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos
90

Die blaue Standardfarbe für iOS 7 ist R:0.0 G:122.0 B:255.0

UIColor *ios7BlueColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];
Tarum
quelle
51
Und wenn Sie Hex bevorzugen:0x007aff
Jason Moore
4
Dies ist nicht sehr zukunftssicher. Wenn Apple die Standardfarbe ändert oder Benutzer die Standardfarbe festlegen können, erhält Ihre App nicht die richtige Farbe.
Prewett
4
und in einem anderen System: # 007AFF
Daleijn
3
In Swift: Lassen Sie defaultTintColor = UIColor (rot: 0,0, grün: 122/255, blau: 1,0, alpha: 1)
Jervisbay
49

Gemäß der Dokumentation für UIButton:

In iOS v7.0 leiten alle Unterklassen von UIView ihr Verhalten für tintColor von der Basisklasse ab. Weitere Informationen finden Sie in der Diskussion zu tintColor auf UIView-Ebene.

Angenommen, Sie ändern tintColor nicht, bevor Sie den Standardwert abgerufen haben, können Sie Folgendes verwenden:

self.view.tintColor
Scott Carter
quelle
Sieht nach dem sichersten Weg aus, um die Farbe zu erfassen.
Cliff Helsel
Das funktioniert bei mir. Mein sharedApplication()hat kein keyWindowmittintColor
SimplGy
26

Hier ist eine einfache Methode, um die Standardfarbe des Systems zu erhalten:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}
Rick
quelle
Sie müssen nicht einmal für Haupt-Thread-Sachen versenden. Ein einfaches Wenn Null wird ausreichen.
Malhal
6
Warum sollte angenommen werden, dass die Methode nur vom Hauptthread aufgerufen wird? Der Overhead zu dispatch_onceist ziemlich gering und ist ein Einzelfall, wenn im allgemeinen Fall geprüft wird.
Rick
@Rick Da UIKit-APIs nicht im Hintergrund threadsicher sind, ist das Aufrufen außerhalb des Hauptthreads ohnehin nicht zulässig.
Andrey Tarantsov
@AndreyTarantsov das ist wahr, aber es ist sicher, UIColorauf mehreren Threads zu verwenden. Das Einwickeln in a dispatch_onceermöglicht das sichere Abrufen dieser Farbe auf jedem Faden. Und wieder ist der Overhead sehr gering.
Rick
3
@AndreyTarantsov von einem schnellen Test scheint es gut zu funktionieren. Aus der UIVIew- Dokumentation : "Manipulationen an der Benutzeroberfläche Ihrer Anwendung müssen im Hauptthread erfolgen. Daher sollten Sie die Methoden der UIView-Klasse immer aus Code aufrufen, der im Hauptthread Ihrer Anwendung ausgeführt wird. Dies ist möglicherweise nur dann nicht unbedingt der Fall Dies ist erforderlich, wenn das Ansichtsobjekt selbst erstellt wird. Alle anderen Manipulationen sollten jedoch im Hauptthread erfolgen. "
Rick
16

schnelle 4-Wege:

extension UIColor {
  static let system = UIView().tintColor!
}
Dmitry Kozlov
quelle
Ich empfehle dringend, das erzwungene Entpacken zu verwenden, da dies zu einem Absturz der Anwendung führen kann, wenn das Standardverhalten von UIKit Framework in einer nächsten Version geändert wird. Auch das Abrufen der Farbtonfarbe von einer UIView-Instanz kann nicht garantieren, dass diese Farbe eine Systemtönungsfarbe ist.
Stanislau Baranouski
@ StanislauBaranouski Warum sollten sie das ändern? Bitte erklären Sie Ihren Standpunkt
Dmitry Kozlov
Hier ist keine Erklärung erforderlich, es ist nur eine schlechte Praxis, erzwungenes Auspacken zu verwenden, insbesondere wenn Sie dies vermeiden können.
Stanislau Baranouski
15

Diese Erweiterung gibt Ihnen die native blaue Farbe des Systems.

extension UIColor {

    static var systemBlue: UIColor {
        return UIButton(type: .system).tintColor
    }

}

AKTUALISIEREN

Bitte vergessen Sie, was ich oben geschrieben habe, haben es gerade herausgefunden - es gibt eine native Erweiterung mit vordefinierten Systemfarben, nach denen wir gesucht haben, einschließlich Systemblau :

// System colors

extension UIColor {


    /* Some colors that are used by system elements and applications.
     * These return named colors whose values may vary between different contexts and releases.
     * Do not make assumptions about the color spaces or actual colors used.
     */

    ... 

    @available(iOS 7.0, *)
    open class var systemBlue: UIColor { get }
    ... 
}

Sie können es direkt verwenden:

myView.tintColor = .systemBlue
Stanislau Baranouski
quelle
1
Dieser erstellt jedes Mal einen UIButton, wenn Sie nach systemBlue fragen. Es ist besser, diese Farbe einmal zu initiieren. Die Verwendung von internen Wörtern in internen Erweiterungen ist nicht benutzerfreundlich. Gleiches gilt für die Verwendung von Klasse anstelle von statisch. Und es "Blau" zu nennen ist nicht richtig, weil diese Farbe später wie in macOS Mojave geändert werden kann. Ist static let system = UIView().tintColor!also immer noch viel besser als deine Variante.
Dmitry Kozlov
@DmitryKozlov Sie richtig, besser statisch aufgrund der Speicherleistung zu verwenden. Vielen Dank für den Hinweis. Aber es "blau" zu nennen funktioniert immer noch bis iOS 12 und es hat überhaupt nichts mit macOS zu tun. Für macOS müssen Sie sich mit dem NSColor-Typ befassen.
Stanislau Baranouski
14

Erhalten Sie die Farbe automatisch mit diesem Code:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!
Lukasz Czerwinski
quelle
10

Die UIWindow.tintColorMethode funktionierte in iOS8 nicht für mich (sie war immer noch schwarz), also musste ich Folgendes tun:

let b = UIButton.buttonWithType(UIButtonType.System) as UIButton
var color = b.titleColorForState(.Normal)

Dies ergab die richtige Blautönung, die in a zu sehen war UIBarButtonItem

cscott530
quelle
Fühlt sich ein bisschen schmutzig an, aber es ist besser als eine Linkfarbe fest zu codieren, die sich im Laufe der Zeit ändern kann.
Timgcarlson
7

Ab iOS 7 gibt es eine API, und Sie können die Farbtonfarbe abrufen (und festlegen) mit:

self.view.tintColor

Oder wenn Sie die CGColor benötigen:

self.view.tintColor.CGColor
Codecraft Studio
quelle
6

In vielen Fällen brauchen Sie nur

[self tintColor] 
// or if in a ViewController
[self.view tintColor]

oder für schnell

self.tintColor
// or if in a ViewController
self.view.tintColor
Ali
quelle
1
self.view.tintColor wahrscheinlicher
malhal
3

Während Sie die Farbe einstellen, können Sie die Farbe wie folgt einstellen

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
Anurag Soni
quelle
Warum muss /255.0mit jedem rgbWert geschrieben werden?
Adil Malik
7
Weil Farben auf Macs zwischen 0,0 und 1,0 schweben.
Malhal
2

Wenn Sie UIColor auf folgende Weise hinzufügen, wird es Ihnen jederzeit zur Verfügung gestellt oder die Definition in Ihrem Code geändert:

@interface UIColor (iOS7Colors)

+ (instancetype)iOS7blueColor;

@end

@implementation UIColor (SpecialColors)

+ (instancetype)iOS7blueColor;
{
    return [UIColor colorWithRed:0.0f green:0.22f blue:122.0/255.0 alpha:1.0f];
}

Sobald Sie die Kategorie in Ihren Code importiert haben, können Sie die Farbe folgendermaßen aufrufen:

UIColor *myBlueColor = [UIColor iOSblueColor];
Renaud Boisjoly
quelle
Bitte versuchen Sie, diese stackoverflow.com/help/deleted-answers zu lesen , um besser zu verstehen, wie man nicht antwortet. Nämlich: "Antworten, die die Frage nicht grundlegend beantworten": kaum mehr als ein Link zu einer externen Seite
Radim Köhler
Äh, wie sind wir von bluezu redin+ (instancetype)iOS7redColor;
ta.speot.is