Comment puis-je obtenir la couleur bleue par défaut d'iOS 7 par programme?

223

Je crée des éléments personnalisés dans mon application et je veux faire correspondre l'apparence du nouvel iOS. iOS 7 nous a présenté une couleur bleue plus claire très commune, la couleur ou la teinte par défaut pour plusieurs éléments, y compris le bouton système, le contrôle segmenté, etc.

entrez la description de l'image ici

Cependant, je n'ai pas trouvé comment accéder facilement à la couleur par programme. J'ai vérifié la documentation UIColor , et il ne semble pas y avoir d'accesseur pour la couleur du système bleu dans la classe elle-même.

Voici ma question: existe-t-il un simple accesseur pour cette couleur? [UIColor ?]ou quelque chose comme ça? Sinon, quelqu'un connaît-il les valeurs RVB exactes pour cette couleur?

Joel H.
la source

Réponses:

252

Utilisez à self.view.tintColorpartir d'un contrôleur de vue ou self.tintColord'une UIViewsous - classe.

Aaron Brager
la source
6
J'allais dire que vous pouvez simplement utiliser UIView().tintColor, mais en fait vous ne pouvez pas. Je ne sais pas à quel moment l'UIView obtient le jeu de couleurs de teinte ...
Dan Rosenstark
1
@DanRosenstark Je pense que le UIWindowou peut-être sa vue racine a la version originale. Les vues héritent de leur couleur de teinte des vues supérieures de la chaîne de répondeurs, mais dans votre exemple, la nouvelle vue n'a pas de vue d'ensemble.
Aaron Brager
2
self.view.tintColorde l'intérieur UIViewController.viewDidLoad()donne le bon bleu.
Nicolas Miari
234

Il semble que ce soit le cas [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

capture d'écran montrant la fenêtre Couleurs

Greg
la source
2
Fait intéressant, le bleu par défaut sur mon système semble être 0: 128: 255 (en utilisant le même outil). Je me demande si Apple l'a changé récemment?
Joel H.
@JoelH. Vérifiez l'espace colorimétrique que vous utilisez actuellement.
Richard J. Ross III
19
Soyez prudent dans la façon dont vous l'utilisez, car cela peut changer dans les versions ultérieures d'iOS.
Zev Eisenberg
7
Oui, ce n'est certainement pas une bonne idée de coder en dur toute valeur qui pourrait potentiellement changer. Surtout quand il existe une API pour interroger la valeur réelle.
Nicolas Miari
1
Version SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos
90

La couleur bleue par défaut d'iOS 7 est 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
la source
51
Et si vous préférez hex:0x007aff
Jason Moore
4
Ce n'est pas très à l'épreuve du temps - si Apple change la couleur de teinte par défaut ou permet aux utilisateurs de définir la couleur de teinte par défaut, votre application n'obtiendra pas la bonne couleur.
prewett
4
et dans un autre système: # 007AFF
daleijn
3
Dans Swift: laissez defaultTintColor = UIColor (rouge: 0.0, vert: 122/255, bleu: 1.0, alpha: 1)
Jervisbay
49

Selon la documentation pour UIButton:

Dans iOS v7.0, toutes les sous-classes d'UIView dérivent leur comportement pour tintColor de la classe de base. Voir la discussion de tintColor au niveau UIView pour plus d'informations.

En supposant que vous ne modifiez pas la teinte avant de saisir la valeur par défaut, vous pouvez utiliser:

self.view.tintColor
Scott Carter
la source
On dirait que le moyen le plus sûr pour saisir la couleur.
Cliff Helsel
Cela fonctionne pour moi. Mon sharedApplication()n'a pas keyWindowdetintColor
SimplGy
26

Voici une méthode simple pour obtenir la couleur de teinte système par défaut:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}
Meule
la source
vous n'avez pas besoin d'être envoyé une seule fois pour le fil principal. Un simple si rien suffira.
malhal
6
Pourquoi supposer que la méthode ne sera appelée qu'à partir du thread principal? Le surcoût dispatch_onceest assez faible et est un seul si check dans le cas commun.
Rick
@Rick Parce que les API UIKit ne sont pas compatibles avec les threads d'arrière-plan, il n'est donc pas autorisé de l'appeler en dehors du thread principal.
Andrey Tarantsov
@AndreyTarantsov c'est vrai, mais il est sûr à utiliser UIColorsur plusieurs threads. L'envelopper dans un dispatch_oncepermet de récupérer en toute sécurité cette couleur sur n'importe quel fil. Et encore une fois, les frais généraux sont très faibles.
Rick
3
@AndreyTarantsov d'un test rapide, il semble bien fonctionner. De la documentation UIVIew : "Les manipulations vers l'interface utilisateur de votre application doivent se produire sur le thread principal. Par conséquent, vous devez toujours appeler les méthodes de la classe UIView à partir du code exécuté dans le thread principal de votre application. La seule fois où cela peut ne pas être strictement nécessaire lors de la création de l’objet de vue lui-même, mais toutes les autres manipulations doivent se produire sur le thread principal. "
Rick
16

rapide 4 voies:

extension UIColor {
  static let system = UIView().tintColor!
}
Dmitry Kozlov
la source
Je vous déconseille fortement d'utiliser le déballage forcé, car cela pourrait provoquer un blocage de l'application, si le comportement par défaut de UIKit Framework sera modifié dans toute version suivante. L'obtention d'une couleur de teinte à partir d'une instance UIView ne pouvait pas garantir que cette couleur soit une couleur de teinte système.
Stanislau Baranouski
@StanislauBaranouski Pourquoi devraient-ils changer cela? Veuillez expliquer votre point de vue
Dmitry Kozlov
pas besoin d'explication ici, c'est juste une mauvaise pratique d'utiliser le déballage forcé, surtout si vous pouvez l'éviter.
Stanislau Baranouski
15

Cette extension vous donne la couleur bleue du système natif.

extension UIColor {

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

}

METTRE À JOUR

Veuillez oublier ce que j'ai écrit ci-dessus, je viens de comprendre - il existe une extension native avec des couleurs système prédéfinies que nous recherchions, y compris le bleu système :

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

Vous pouvez l'utiliser directement:

myView.tintColor = .systemBlue
Stanislau Baranouski
la source
1
Celui-ci créera UIButton chaque fois que vous demanderez à systemBlue de mieux initier cette couleur une fois. L'utilisation d'un mot interne dans une extension interne n'est pas conviviale. Idem pour utiliser la classe au lieu de statique. Et l'appeler "Bleu" n'est pas correct, car cette couleur peut être modifiée plus tard comme dans macOS Mojave. C'est donc static let system = UIView().tintColor!bien mieux que votre variante.
Dmitry Kozlov
@DmitryKozlov vous avez raison, mieux vaut utiliser les performances de la mémoire statique. Merci d'avoir signalé cela. Mais l'appeler "bleu" fonctionne toujours jusqu'à iOS 12 et ce n'est pas du tout lié à macOS. Pour macOS, vous devez gérer le type NSColor.
Stanislau Baranouski
14

Obtenez la couleur automatiquement en utilisant ce code:

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

La UIWindow.tintColorméthode ne fonctionnait pas pour moi dans iOS8 (elle était toujours noire), j'ai donc dû faire ceci:

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

Cela a donné la teinte bleue appropriée vu dans un UIBarButtonItem

cscott530
la source
Cela semble un peu sale, mais c'est mieux que de coder en dur une couleur de lien qui peut changer avec le temps.
timgcarlson
7

Depuis iOS 7, il existe une API et vous pouvez obtenir (et définir) la couleur de la teinte avec:

self.view.tintColor

Ou si vous avez besoin du CGColor:

self.view.tintColor.CGColor
Codecraft Studio
la source
6

Dans de nombreux cas, ce dont vous avez besoin est

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

ou pour rapide

self.tintColor
// or if in a ViewController
self.view.tintColor
Ali
la source
1
self.view.tintColor plus probable
malhal
3

tout en définissant la couleur, vous pouvez définir la couleur comme ceci

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
Anurag Soni
la source
Pourquoi faut-il écrire /255.0avec chaque rgbvaleur?
Adil Malik
7
Parce que les couleurs sur Mac sont un flottant entre 0,0 et 1,0.
malhal
2

L'ajout d'une catégorie à UIColor de la manière suivante la rendra disponible à tout moment où vous en aurez besoin ou même changer sa définition à travers votre code:

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

Une fois que vous avez importé la catégorie dans votre code, vous pouvez appeler la couleur en utilisant:

UIColor *myBlueColor = [UIColor iOSblueColor];
Renaud Boisjoly
la source
S'il vous plaît, essayez de lire ce stackoverflow.com/help/deleted-answers , pour mieux comprendre comment ne pas répondre. A savoir: "Des réponses qui ne répondent pas fondamentalement à la question": à peine plus qu'un lien vers un site externe
Radim Köhler
Euh, comment est-on bluered+ (instancetype)iOS7redColor;
passé