Estaba buscando poder convertir cualquier UIColor en un degradado. La forma en que tengo la intención de hacer esto es usando Core Graphics para dibujar un degradado. Lo que intento hacer es obtener un color, digamos:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
y obtener un color UIC que es un poco más oscuro y un poco más claro. ¿Alguien sabe como hacer esto? Gracias.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
fuente
fuente
Respuestas:
Úselo así:
EDITAR : como señaló @Anchu Chimala, para una máxima flexibilidad, estos métodos deben implementarse como una categoría UIColor. Además, según la idea de @ Riley, puede ser una mejor idea hacer que el color sea más oscuro o más claro en lugar de sumar o restar valores constantes. Como señaló @jrturton, no es necesario manipular los componentes RGB; Es mejor modificar la propiedad de brillo en sí. Considerándolo todo:
fuente
getHue:saturation:brightness
firma de UIKit, parece que funciona con HSV en lugar de HSB. Cambiar el brillo (de hecho, el valor) en este contexto no funcionará. Por ejemplo, el rojo puro (rgb (255,0,0)) tendrá un brillo / valor de 1, por lo que será imposible aligerar el brillo. Terminé trabajando con cambios en los valores RGB en su lugar.getHue:saturation:brightness:alpha
Volverá FALSO.luminance
valor del espacio de color LAB es el verdadero que debe tener en cuenta al hacer que los colores sean más claros / oscuros. Vea mi respuesta sobre cómo puede usarlo y resolver este problema de la manera correcta.TL; DR:
Rápido:
Uso:
C objetivo:
@rchampourlier tenía razón en su comentario a @ user529758 (La respuesta aceptada): las soluciones HSB (o HSV) y RGB dan resultados completamente diferentes. RGB solo agrega (o acerca el color) al blanco, y la solución HSB acerca el color al borde en la escala Brigtness, que básicamente comienza con el negro y termina con el color puro ...
Básicamente, el Brillo (Valor) hace que el color sea menos o más cercano al negro, mientras que Saturación lo hace menos o más cercano al blanco ...
Como se ve aquí:
Entonces, la solución para hacer que un color sea realmente más brillante (es decir, más cercano al blanco ...) será hacer que su valor de Saturación sea más pequeño , dando como resultado esta solución:
fuente
Extensión universal Swift para iOS y OS X , usando getHue :
Uso:
O (con los valores predeterminados):
Muestra:
fuente
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
y luego reemplazando lagetHue
llamada con una llamada al color:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
antes de la cantidad de palabras. Debería serprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Solo quería dar el mismo resultado, en RGB, que
Lo que da el mismo resultado, AFAIK, que elegir el color en un degradado 'color a blanco' o 'color a negro', a x% del tamaño del degradado.
Para ese propósito, las matemáticas son simples:
Aquí hay ejemplos con algunos colores.
fuente
La solución de user529758 en Swift:
Color más oscuro:
Color más claro:
fuente
var darker: UIColor
por ejemplo.Si convierte el color RGB al modelo de color HSL , puede variar el componente L = claridad de L = 0.0 (negro) sobre L = 0.5 (color natural) a L = 1.0 (blanco).
UIColor
no puede manejar HSL directamente, pero existen fórmulas para convertir RGB <-> HSL.fuente
Ninguna de las soluciones publicadas funcionó bastante para todos los colores y sombras, pero luego me topé con esta biblioteca que proporciona un conjunto de extensiones muy bien implementadas para UIColor.
Específicamente tiene una función de aclarado como parte de su implementación HSL:
(UIColor *)lighten:(CGFloat)amount
- que funciona perfectamente.fuente
Sebyddd
solución como una extensión:Uso:
fuente
Si desea que la solución user529758 funcione con sombras grises (como
[UIColor lightGrayColor]
o[UIColor darkGrayColor]
tiene que mejorarla así:getHue:saturation:brightness:alpha
falla (y regresafalse
) cuando se le solicita un tono gris, por lo tanto, deberá usarlogetWhite:alpha
.fuente
UIColor extensión y fijación encendedorColorForColor
fuente
Todas las demás respuestas en este hilo usan el sistema de color RGB o simplemente cambian el tono o el valor de brillo del sistema HSB . Como se explica en detalle en esta gran publicación de blog, la forma correcta de hacer que un color sea más claro o más oscuro es cambiar su
luminance
valor. Ninguna de las otras respuestas hace eso. Si quieres hacerlo bien, usa mi solución o escribe la tuya después de leer la publicación del blog.Desafortunadamente, es bastante complicado cambiar cualquiera de los atributos de un UIColor por defecto . Además, Apple ni siquiera admite ningún espacio de color basado en LAB como HCL en la
UIColor
clase (L
en LAB es elluminance
valor que estamos buscando).El uso de HandyUIKit (instalarlo a través de Carthage) agrega soporte para HCL y hace su vida mucho más fácil :
También hay una opción para aplicar un cambio relativo (recomendado):
Tenga en cuenta que HandyUIKit también agrega otras características útiles de interfaz de usuario en su proyecto: consulte su archivo README en GitHub para obtener más detalles.
¡Espero que ayude!
fuente
No estoy seguro de si está buscando algún tipo de respuesta Objective-C, pero en función de cómo funcionan los colores especificados por RGBA, creo que simplemente puede escalar los valores RGB según un factor arbitrario para obtener un "más claro" o sombra "más oscura". Por ejemplo, puede tener un azul:
¿Quieres un azul más oscuro? Multiplique los valores RGB por 0.9:
Voila O tal vez tienes una naranja:
Elija otro factor de escala, digamos, 0.8:
¿Es ese el tipo de efecto que estás buscando?
fuente
Probado en Xcode 10 con Swift 4.x para iOS 12
Comience con su color como UIColor y elija un factor de oscurecimiento (como CGFloat)
El tipo CGColor tiene un valor opcional
components
que divide el color en RGBA (como una matriz CGFloat con valores entre 0 y 1). Luego puede reconstruir un UIColor utilizando valores RGBA tomados del CGColor y manipularlos.En este ejemplo, cada uno de los valores RGB se dividió entre 2, haciendo que el color fuera la mitad de oscuro que antes. El valor alfa permaneció igual, pero también podría aplicar el factor de oscurecimiento en el valor alfa en lugar del RGB.
fuente
Swift 5
fuente
Idealmente, las funciones deberían estar encapsuladas dentro de una
UIColor
extensión llamadaUIColor+Brightness.swift
, y tener un brillo configurable; consulte el siguiente ejemplo:fuente
Renderizo celdas de colores en función de un valor de estado:
Para esto, escribí una extensión rápida basada en un viejo código objc después de recibir un error al usar la sugerencia de CryingHippo:
Lo mismo funciona
NSColor
también. Simplemente reemplaceUIColor
conNSColor
.fuente
Aquí hay una categoría UIColor que también permite controlar la cantidad de cambio de color.
fuente
Una extensión Swift basada en la respuesta @Sebyddd:
fuente
para un color más oscuro, este es el más simple: theColor = [theColor shadowWithLevel: s]; //s:0.0 a 1.0
fuente