Come posso ottenere il colore blu predefinito di iOS 7 a livello di codice?


223

Sto creando elementi personalizzati nella mia app e voglio abbinare l'aspetto del nuovo iOS. iOS 7 ci ha presentato un colore blu più chiaro molto comune, il colore o la tinta predefinita per diversi elementi, tra cui il pulsante di sistema, il controllo segmentato, ecc. Hanno reso facile selezionare il colore usando IB, come visto qui:

inserisci qui la descrizione dell'immagine

Tuttavia, non ho trovato il modo di accedere facilmente al colore a livello di codice. Ho controllato la documentazione di UIColor e non sembra esserci alcun accessorio per il colore di sistema blu nella classe stessa.

Ecco la mia domanda: esiste un semplice accessorio per questo colore? [UIColor ?]o qualcosa del genere? In caso contrario, qualcuno conosce i valori esatti RGB per quel colore?

Risposte:


252

Utilizzare self.view.tintColorda un controller di visualizzazione o self.tintColorda una UIViewsottoclasse.


6
Stavo per dire che puoi semplicemente usare UIView().tintColor, ma in realtà non puoi. Non so a che punto UIView ottiene il set di colori della tinta ...
Dan Rosenstark

1
@DanRosenstark Penso che la UIWindowsua vista radice o forse abbia la versione originale. Le viste ereditano il colore della loro tinta da viste più alte nella catena del risponditore, ma nel tuo esempio la nuova vista non ha superview.
Aaron Brager,

2
self.view.tintColordall'interno UIViewController.viewDidLoad()dà il giusto blu.
Nicolas Miari,

234

Sembra essere [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

screenshot che mostra la finestra Colori


2
È interessante notare che il blu predefinito sul mio sistema sembra essere 0: 128: 255 (usando lo stesso strumento). Mi chiedo se Apple lo abbia cambiato di recente?
Joel H.,

@JoelH. Controlla lo spazio colore che stai attualmente utilizzando.
Richard J. Ross III,

19
Fai attenzione a come lo usi, poiché potrebbe cambiare nelle successive versioni di iOS.
Zev Eisenberg,

7
Sì, sicuramente non è una buona idea codificare qualsiasi valore che potrebbe potenzialmente cambiare. Soprattutto quando esiste un'API per eseguire una query sul valore effettivo.
Nicolas Miari,

1
Versione SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos,

90

Il colore blu predefinito di iOS 7 è 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];

51
E se preferisci hex:0x007aff
Jason Moore,

4
Questa non è una prova per il futuro: se Apple cambia il colore predefinito della tinta o consente agli utenti di impostare il colore predefinito della tinta, l'app non otterrà il colore corretto.
prewett

4
e in un altro sistema: # 007AFF
daleijn

3
In Swift: let defaultTintColor = UIColor (rosso: 0.0, verde: 122/255, blu: 1.0, alfa: 1)
Jervisbay

49

Secondo la documentazione per UIButton:

In iOS v7.0, tutte le sottoclassi di UIView derivano il loro comportamento per tintColor dalla classe base. Vedi la discussione di tintColor a livello di UIView per ulteriori informazioni.

Supponendo di non modificare tintColor prima di acquisire il valore predefinito, è possibile utilizzare:

self.view.tintColor

Sembra il modo più sicuro per afferrare il colore.
Cliff Helsel,

Questo funziona per me. Il mio sharedApplication()non ha un keyWindowcontintColor
Semplicemente

26

Ecco un metodo semplice per ottenere il colore di tinta predefinito del sistema:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}

non è necessario spedire una volta per le cose principali del thread. Un semplice se zero sarà sufficiente.
Malhal,

6
Perché presumere che il metodo verrà chiamato solo dal thread principale? Il sovraccarico dispatch_onceè piuttosto basso ed è un singolo se si verifica nel caso comune.
Rick,

@Rick Poiché le API UIKit non sono thread-safe in background, quindi non è consentito chiamarlo al di fuori del thread principale.
Andrey Tarantsov,

@AndreyTarantsov è vero, ma è sicuro da usare UIColorsu più thread. Avvolgendolo in un dispatch_oncemodo per recuperare in modo sicuro questo colore su qualsiasi filo. E ancora, il sovraccarico è molto basso.
Rick,

3
@AndreyTarantsov da un test rapido sembra funzionare bene. Dalla documentazione di UIVIew : "Le manipolazioni all'interfaccia utente della tua applicazione devono avvenire sul thread principale. Pertanto, dovresti sempre chiamare i metodi della classe UIView dal codice in esecuzione nel thread principale della tua applicazione. L'unica volta che potrebbe non essere rigorosamente necessario quando si crea l'oggetto view stesso, ma tutte le altre manipolazioni dovrebbero avvenire sul thread principale. "
Rick,


16

veloce in 4 direzioni:

extension UIColor {
  static let system = UIView().tintColor!
}

Sconsigliamo vivamente di utilizzare il wrapping forzato, poiché potrebbe causare l'arresto anomalo dell'applicazione, se il comportamento predefinito di UIKit Framework verrà modificato in qualsiasi versione successiva. Anche ottenere il colore della tinta da un'istanza di UIView non può garantire che questo colore sia un colore di tinta di sistema.
Stanislau Baranouski,

@StanislauBaranouski Perché dovrebbero cambiarlo? Per favore, spiega il tuo punto
Dmitry Kozlov,

non c'è bisogno di spiegazioni qui, è solo una cattiva pratica usare lo scartamento forzato, specialmente se puoi evitarlo.
Stanislau Baranouski,

15

Questa estensione ti dà il colore blu del sistema nativo.

extension UIColor {

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

}

AGGIORNARE

Per favore, dimentica quello che ho scritto sopra, appena capito: ci sono estensioni native con colori di sistema predefiniti che stavamo cercando, incluso il blu di sistema :

// 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 }
    ... 
}

Puoi usarlo direttamente:

myView.tintColor = .systemBlue

1
Questo creerà UIButton ogni volta che chiederai systemBlue è meglio iniziare questo colore una volta. L'uso della parola interna nell'estensione interna non è facile da usare. Lo stesso vale per l'utilizzo della classe anziché statica. E chiamarlo "Blu" non è giusto, perché questo colore può essere cambiato in seguito come in macOS Mojave. Quindi static let system = UIView().tintColor!è ancora molto meglio della tua variante.
Dmitry Kozlov

@DmitryKozlov hai ragione, meglio usare le prestazioni statiche della memoria dovute. Grazie per averlo indicato. Ma chiamarlo "blu" funziona ancora fino a iOS 12 e non è affatto correlato a macOS. Per macOS devi trattare con il tipo NSColor.
Stanislau Baranouski

14

Ottieni automaticamente il colore utilizzando questo codice:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!

10

Il UIWindow.tintColormetodo non funzionava per me in iOS8 (era ancora nero), quindi ho dovuto fare questo:

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

Questo ha dato la giusta tonalità blu vista in a UIBarButtonItem


Sembra un po 'sporco, ma è meglio che programmare un colore di collegamento che può cambiare nel tempo.
timgcarlson,

7

Da iOS 7 c'è un'API e puoi ottenere (e impostare) il colore della tinta con:

self.view.tintColor

O se hai bisogno di CGColor:

self.view.tintColor.CGColor

6

In molti casi ciò di cui hai bisogno è giusto

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

o per rapido

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

1
self.view.tintColor più probabilmente
malhal

3

durante l'impostazione del colore è possibile impostare il colore in questo modo

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]

Perché è necessario scrivere /255.0con ciascun rgbvalore?
Adil Malik,

7
Perché i colori sui mac sono un float tra 0,0 e 1,0.
Malhal,

2

L'aggiunta di una categoria a UIColor nel modo seguente ti renderà disponibile ogni volta che ne avrai bisogno o addirittura cambierà la sua definizione attraverso il tuo codice:

@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];
}

Una volta importata la Categoria nel tuo codice, puoi chiamare il colore usando:

UIColor *myBlueColor = [UIColor iOSblueColor];

Per favore, prova a leggere questo stackoverflow.com/help/deleted-answers , per capire meglio come non rispondere. Vale a dire: "Risposte che non rispondono sostanzialmente alla domanda": a malapena più di un collegamento a un sito esterno
Radim Köhler,

Uh Com'è che otteniamo da bluea redin+ (instancetype)iOS7redColor;
ta.speot.is
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.