Como posso obter a cor azul padrão do iOS 7 programaticamente?

223

Estou criando elementos personalizados no meu aplicativo e quero corresponder à aparência do novo iOS. O iOS 7 nos apresentou uma cor azul mais clara muito comum, a cor ou tonalidade padrão para vários elementos, incluindo o botão do sistema, controle segmentado etc. Eles facilitaram a seleção da cor usando o IB, como visto aqui:

insira a descrição da imagem aqui

No entanto, não achei como acessar facilmente a cor programaticamente. Verifiquei a documentação do UIColor e não parece haver nenhum acessador para a cor azul do sistema na própria classe.

Aqui está minha pergunta: existe um acessador simples para essa cor? [UIColor ?]ou algo assim? Caso contrário, alguém sabe os valores RGB exatos para essa cor?

Joel H.
fonte

Respostas:

252

Use a self.view.tintColorpartir de um controlador de exibição ou self.tintColorde uma UIViewsubclasse.

Aaron Brager
fonte
6
Eu ia dizer que você pode simplesmente usar UIView().tintColor, mas na verdade não pode. Não tenho certeza em que ponto o UIView recebe o conjunto cor da tonalidade ...
Dan Rosenstark
1
@ DanRosenstark Eu acho que o UIWindowou talvez sua visualização raiz tenha a versão original. As exibições herdam a cor da tonalidade das exibições mais altas na cadeia de respostas, mas no seu exemplo, a nova exibição não tem superview.
Aaron Brager
2
self.view.tintColorde dentro UIViewController.viewDidLoad()dá o azul certo.
Nicolas Miari
234

Parece ser [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

captura de tela mostrando a janela Cores

Greg
fonte
2
Curiosamente, o azul padrão no meu sistema parece ser 0: 128: 255 (usando a mesma ferramenta). Gostaria de saber se a Apple mudou recentemente?
Joel H.
@JoelH. Verifique o espaço de cores que você está usando no momento.
Richard J. Ross III
19
Cuidado ao usar isso, pois isso pode mudar nas versões subseqüentes do iOS.
Zev Eisenberg
7
Sim, definitivamente não é uma boa ideia codificar qualquer valor que possa mudar potencialmente. Especialmente quando há uma API para consultar o valor real.
Nicolas Miari
1
Versão SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos
90

A cor azul padrão do 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];
tarum
fonte
51
E se você preferir hex:0x007aff
Jason Moore
4
Isso não é uma prova muito futura - se a Apple alterar a cor da tonalidade padrão ou permitir que os usuários definam a cor da tonalidade padrão, seu aplicativo não obterá a cor correta.
Prewett
4
e em outro sistema: # 007AFF
daleijn
3
No Swift: deixe defaultTintColor = UIColor (vermelho: 0.0, verde: 122/255, azul: 1.0, alpha: 1)
Jervisbay 8/16
49

De acordo com a documentação do UIButton:

No iOS v7.0, todas as subclasses do UIView derivam seu comportamento para tintColor da classe base. Veja a discussão do tintColor no nível UIView para obter mais informações.

Supondo que você não altere o tintColor antes de obter o valor padrão, você pode usar:

self.view.tintColor
Scott Carter
fonte
Parece a maneira mais segura de pegar a cor.
Cliff Helsel
Isso funciona para mim. Meu sharedApplication()não tem um keyWindowcomtintColor
SimplGy
26

Aqui está um método simples para obter a cor padrão da tonalidade do 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;
}
Rick
fonte
você não precisa despachar uma vez para o material do thread principal. Um simples se nulo será suficiente.
malhal
6
Por que supor que o método será chamado apenas a partir do thread principal? A sobrecarga para dispatch_onceé bastante baixa e é única se verificar no caso comum.
Rick
@ Rick Como as APIs do UIKit não são seguras para threads em segundo plano, portanto, não é permitido chamá-lo fora do thread principal.
Andrey Tarantsov
@AndreyTarantsov isso é verdade, mas é seguro usar UIColorem vários threads. Envolvê-lo em dispatch_oncepermite recuperar com segurança essa cor em qualquer linha. E, novamente, a sobrecarga é muito baixa.
Rick
3
@AndreyTarantsov de um teste rápido, parece funcionar bem. Na documentação do UIVIew : "Manipulações da interface do usuário do seu aplicativo devem ocorrer no encadeamento principal. Portanto, você sempre deve chamar os métodos da classe UIView a partir do código em execução no encadeamento principal do seu aplicativo. O único momento em que isso pode não ser estritamente é necessário ao criar o próprio objeto de exibição, mas todas as outras manipulações devem ocorrer no encadeamento principal ".
Rick
16

rápida maneira 4:

extension UIColor {
  static let system = UIView().tintColor!
}
Dmitry Kozlov
fonte
Eu não recomendo que você use o desembrulhamento forçado, pois isso pode causar uma falha no aplicativo, se o comportamento padrão do UIKit Framework for alterado em qualquer próxima versão. A obtenção de cores de tonalidade de uma instância do UIView não poderia garantir que essa cor seja de tonalidade do sistema.
Stanislau Baranouski 10/10
@StanislauBaranouski Por que eles deveriam mudar isso? Por favor, explique seu ponto de vista
Dmitry Kozlov,
Não há necessidade de explicação aqui, é apenas uma prática ruim usar o desembrulhamento forçado, especialmente se você puder evitá-lo.
Stanislau Baranouski 28/02/19
15

Esta extensão fornece a cor azul do sistema nativo.

extension UIColor {

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

}

ATUALIZAR

Por favor, esqueça o que escrevi acima, apenas descobri - existem extensões nativas com cores predefinidas do sistema que procurávamos, incluindo o azul do 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 }
    ... 
}

Você pode usá-lo diretamente:

myView.tintColor = .systemBlue
Stanislau Baranouski
fonte
1
Este criará o UIButton toda vez que você solicitar ao systemBlue, é melhor iniciar essa cor uma vez. Usar a palavra interna na extensão interna não é fácil de usar. O mesmo para usar classe em vez de estática. E chamá-lo de "Azul" não está certo, pois essa cor pode ser alterada mais tarde, como no macOS Mojave. Então, static let system = UIView().tintColor!ainda é muito melhor que a sua variante.
Dmitry Kozlov
@DmitryKozlov você está certo, é melhor usar o desempenho estático da memória devido. Obrigado por apontar para isso. Mas chamá-lo de "azul" ainda funciona no iOS 12 e não está relacionado ao macOS. Para o macOS, você precisa lidar com o tipo NSColor.
Stanislau Baranouski
14

Obtenha a cor automaticamente usando este código:

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

O UIWindow.tintColormétodo não estava funcionando para mim no iOS8 (ainda estava preto), então tive que fazer o seguinte:

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

Isso deu o tom azul adequado visto em um UIBarButtonItem

cscott530
fonte
Parece um pouco sujo, mas é melhor do que codificar uma cor de link que pode mudar com o tempo.
214166 TimothyRock: (
7

No iOS 7, há uma API e você pode obter (e definir) a cor da tonalidade com:

self.view.tintColor

Ou se você precisar do CGColor:

self.view.tintColor.CGColor
Codecraft Studio
fonte
6

Em muitos casos, o que você precisa é apenas

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

ou para agilidade

self.tintColor
// or if in a ViewController
self.view.tintColor
Todos
fonte
1
self.view.tintColor mais provável
malhal
3

enquanto define a cor, você pode definir cores como esta

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
Anurag Soni
fonte
Por que é necessário escrever /255.0com cada rgbvalor?
Adil Malik
7
Como as cores nos macs variam de 0,0 a 1,0.
malhal
2

A adição de uma categoria ao UIColor da seguinte maneira a disponibilizará sempre que você precisar ou até mesmo alterará sua definição em todo o seu código:

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

Depois de importar a categoria no seu código, você pode chamar a cor usando:

UIColor *myBlueColor = [UIColor iOSblueColor];
Renaud Boisjoly
fonte
Por favor, tente ler este stackoverflow.com/help/deleted-answers , para entender melhor como não responder. A saber: "As respostas que não respondem fundamentalmente a questão": pouco mais de um link para um site externo
Radim Köhler
Uh como chegamos a partir bluede redin+ (instancetype)iOS7redColor;
ta.speot.is 15/10