¿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?

Joel H.
fuente

Respuestas:

252

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

Aaron Brager
fuente
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

Greg
fuente
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];
tarum
fuente
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
Scott Carter
fuente
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;
}
Almiar
fuente
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!
}
Dmitry Kozlov
fuente
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
Stanislau Baranouski
fuente
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)!
Lukasz Czerwinski
fuente
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

cscott530
fuente
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
Codecraft Studio
fuente
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
Ali
fuente
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]
Anurag Soni
fuente
¿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];
Renaud Boisjoly
fuente
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