¿Cómo puedo obtener el color azul predeterminado de iOS 7 mediante programación?


223

Estoy creando elementos personalizados en mi aplicación y quiero coincidir con el aspecto del nuevo iOS. iOS 7 nos presentó un color azul claro más común, el color o tinte predeterminado para varios elementos, incluido el botón del sistema, el control segmentado, etc. Han facilitado la selección del color usando IB, como se ve aquí:

ingrese la descripción de la imagen aquí

Sin embargo, no he encontrado cómo acceder fácilmente al color mediante programación. Fui a ver el documentación UIColor , y no parece haber ningún descriptor de acceso para el sistema de color azul en la propia clase.

Aquí está mi pregunta: ¿existe un descriptor de acceso simple para este color? [UIColor ?]o algo asi? Si no, ¿alguien sabe los valores RGB exactos para ese color?

Respuestas:


252

Usar self.view.tintColordesde un controlador de vista o self.tintColordesde una UIViewsubclase.


66
Iba a decir que solo puedes usar UIView().tintColor, pero en realidad no puedes. No estoy seguro de en qué punto el UIView obtiene el color de tinte establecido ...
Dan Rosenstark

1
@DanRosenstark Creo que UIWindowo tal vez su vista raíz tiene la versión original. Las vistas heredan su color de tinte de las vistas más altas en la cadena de respuesta, pero en su ejemplo, la nueva vista no tiene supervista.
Aaron Brager el

2
self.view.tintColordesde adentro UIViewController.viewDidLoad()da el azul correcto.
Nicolas Miari

234

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

captura de pantalla que muestra la ventana Colores


2
Curiosamente, el azul predeterminado en mi sistema parece ser 0: 128: 255 (usando la misma herramienta). Me pregunto si Apple lo cambió recientemente.
Joel H.

@JoelH. Verifique el espacio de color que está utilizando actualmente.
Richard J. Ross III

19
Tenga cuidado al usar esto, ya que puede cambiar en versiones posteriores de iOS.
Zev Eisenberg

77
Sí, definitivamente no es una buena idea codificar cualquier valor que pueda cambiar. Especialmente cuando hay una API para consultar el valor real.
Nicolas Miari

1
Versión rápidaUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

El color azul predeterminado de iOS 7 es 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
Y si prefieres hechizo:0x007aff
Jason Moore

44
Esto no es una prueba para el futuro: si Apple cambia el color de tinte predeterminado o permite a los usuarios configurar el color de tinte predeterminado, su aplicación no obtendrá el color correcto.
prewett

44
y en otro sistema: # 007AFF
daleijn

3
En Swift: let defaultTintColor = UIColor (rojo: 0.0, verde: 122/255, azul: 1.0, alfa: 1)
Jervisbay

49

De acuerdo con la documentación de UIButton:

En iOS v7.0, todas las subclases de UIView derivan su comportamiento para tintColor de la clase base. Consulte la discusión sobre tintColor en el nivel UIView para obtener más información.

Suponiendo que no cambia el tintColor antes de tomar el valor predeterminado, puede usar:

self.view.tintColor

Parece la forma más segura de agarrar el color.
Cliff Helsel

Esto funciona para mi. Mi sharedApplication()no tiene un keyWindowcontintColor
SimplGy

26

Aquí hay un método simple para obtener el color de tinte predeterminado 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;
}

no necesita despacho una vez para el hilo principal. Un simple si nulo será suficiente.
malhal

66
¿Por qué asumir que el método solo se llamará desde el hilo principal? La sobrecarga dispatch_oncees bastante baja y es única si se verifica en el caso común.
Rick

@Rick Debido a que las API de UIKit no son seguras para subprocesos en segundo plano, de todos modos no está permitido llamarlo fuera del subproceso principal.
Andrey Tarantsov

@AndreyTarantsov es cierto, pero es seguro de usar UIColoren múltiples hilos. Envolverlo en un dispatch_oncepermite recuperar con seguridad este color en cualquier hilo. Y nuevamente, la sobrecarga es muy baja.
Rick

3
@AndreyTarantsov de una prueba rápida parece funcionar bien. De la UIVIew documentación de : "Las manipulaciones a la interfaz de usuario de su aplicación deben ocurrir en el hilo principal. Por lo tanto, siempre debe llamar a los métodos de la clase UIView desde el código que se ejecuta en el hilo principal de su aplicación. La única vez que esto no sea estrictamente es necesario cuando se crea el objeto de vista en sí, pero todas las demás manipulaciones deberían ocurrir en el hilo principal ".
Rick


16

4 vías rápidas:

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

No recomiendo encarecidamente que utilice el desenvolvimiento forzado, ya que podría causar el bloqueo de la aplicación, si el comportamiento predeterminado de UIKit Framework se cambiará en cualquier próxima versión. Además, obtener un color de tinte de una instancia de UIView no puede garantizar que este color sea un color de tinte del sistema.
Stanislau Baranouski

@StanislauBaranouski ¿Por qué deberían cambiar eso? Por favor explique su punto
Dmitry Kozlov

no es necesario explicarlo aquí, es una mala práctica usar el desenvolvimiento forzado, especialmente si puede evitarlo.
Stanislau Baranouski

15

Esta extensión le da color azul al sistema nativo.

extension UIColor {

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

}

ACTUALIZAR

Olvídese de lo que escribí anteriormente, que acabo de descubrir: hay una extensión nativa con colores de sistema predefinidos que hemos estado buscando, incluido el azul del 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 }
    ... 
}

Puedes usarlo directamente:

myView.tintColor = .systemBlue

1
Este creará UIButton cada vez que solicite systemBlue es mejor iniciar este color una vez. El uso de palabras internas en extensiones internas no es fácil de usar. Lo mismo para usar class en lugar de static. Y llamarlo "Azul" no está bien, porque este color se puede cambiar más tarde, como en macOS Mojave. Entonces static let system = UIView().tintColor!todavía es mucho mejor que tu variante.
Dmitry Kozlov

@DmitryKozlov tienes razón, mejor usar el rendimiento de la memoria debida estática. Gracias por señalar eso. Pero llamarlo "azul" todavía funciona hasta iOS 12 y no está relacionado con macOS en absoluto. Para macOS tienes que lidiar con el tipo NSColor.
Stanislau Baranouski

14

Obtenga el color automáticamente usando este código:

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

10

El UIWindow.tintColormétodo no me funcionaba en iOS8 (todavía era negro), así que tuve que hacer esto:

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

Esto dio el tinte azul apropiado visto en un UIBarButtonItem


Se siente un poco sucio, pero es mejor que codificar un color de enlace que puede cambiar con el tiempo.
timgcarlson

7

Desde iOS 7 hay una API y puede obtener (y configurar) el color de tinte con:

self.view.tintColor

O si necesita el CGColor:

self.view.tintColor.CGColor

6

En muchos casos lo que necesitas es solo

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

o por rápido

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

1
self.view.tintColor más probable
malhal

3

mientras establece el color, puede establecer un color como este

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

¿Por qué es necesario escribir /255.0con cada rgbvalor?
Adil Malik

77
Porque los colores en las Mac son flotantes entre 0.0 y 1.0.
malhal

2

Agregar una categoría a UIColor de la siguiente manera lo pondrá a su disposición en cualquier momento que lo necesite o incluso cambiará su definición en su 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];
}

Una vez que importe la Categoría en su código, puede llamar al color usando:

UIColor *myBlueColor = [UIColor iOSblueColor];

Por favor, intente leer este stackoverflow.com/help/deleted-answers para comprender mejor cómo no responder. A saber: "Respuestas que no responden fundamentalmente a la pregunta": apenas más que un enlace a un sitio externo
Radim Köhler

Uh ¿Cómo obtenemos de blueque reden+ (instancetype)iOS7redColor;
ta.speot.is
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.