Eu estava procurando ser capaz de transformar qualquer UIColor em um gradiente. A maneira como pretendo fazer isso é usar o Core Graphics para desenhar um gradiente. O que estou tentando fazer é obter uma cor, digamos:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
e obtenha um UIColor que é alguns tons mais escuro e alguns tons mais claro. Alguém sabe como fazer isso? Obrigado.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
fonte
fonte
Respostas:
Use-o assim:
EDIT : como apontou @Anchu Chimala, para flexibilidade máxima, esses métodos devem ser implementados como uma categoria UIColor. Além disso, a partir da ideia de @ Riley, pode ser uma idéia melhor tornar a cor propriamente mais escura ou mais clara, em vez de adicionar ou subtrair valores constantes. Como o @jrturton apontou, não é necessário manipular os componentes RGB; é melhor modificar a propriedade de brilho em si. Contudo:
fonte
getHue:saturation:brightness
assinatura do UIKit, parece que funciona com HSV em vez de HSB. Alterar o brilho (portanto, o valor) nesse contexto não funcionará. Por exemplo, o vermelho puro (rgb (255,0,0)) terá um brilho / valor de 1, tornando impossível a iluminação através do brilho. Acabei trabalhando com alterações nos valores RGB.getHue:saturation:brightness:alpha
retornará FALSE.luminance
valor do espaço de cores do LAB é o verdadeiro com o qual você deve se preocupar ao tornar as cores mais claras / mais escuras. Veja minha resposta sobre como você pode usá-lo e resolver esse problema da maneira certa.TL; DR:
Rápido:
Uso:
Objetivo-C:
@rchampourlier estava certo em seu comentário para @ user529758 (A resposta aceita) - As soluções HSB (ou HSV) e RGB oferecem resultados completamente diferentes. O RGB apenas adiciona (ou aproxima a cor) o branco, e a solução HSB aproxima a cor da borda na escala Brigtness - que basicamente começa com preto e termina com a cor pura ...
Basicamente, o brilho (valor) torna a cor menos ou mais próxima do preto, enquanto a saturação a torna menos ou mais próxima do branco ...
Como visto aqui:
Portanto, a solução para fazer uma cor realmente brilhante (ou seja, mais perto de branco ...) será para torná-lo do valor de saturação menor , resultando esta solução:
fonte
Extensão universal Swift para iOS e OS X , usando getHue :
Uso:
OU (com os valores padrão):
Amostra:
fonte
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
e substituindo agetHue
chamada por colorida:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
antes da palavra. Deveria serprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Eu só queria dar o mesmo resultado, em RGB, do que
O que dá o mesmo resultado, AFAIK, do que escolher a cor em um gradiente 'cor para branco' ou 'cor para preto', em x% do tamanho do gradiente.
Para esse propósito, a matemática é simples:
Aqui estão alguns exemplos com algumas cores
fonte
A solução de user529758 no Swift:
Cor mais escura:
Cor mais clara:
fonte
var darker: UIColor
por exemplo.Se você converter a cor RGB no modelo de cores HSL , poderá alterar o componente L = luminosidade de L = 0,0 (preto) sobre L = 0,5 (cor natural) para L = 1,0 (branco).
UIColor
não pode manipular HSL diretamente, mas há uma fórmula para converter RGB <-> HSL.fonte
Nenhuma das soluções postadas funcionou bem para todas as cores e tons, mas então eu me deparei com essa biblioteca, que fornece um conjunto de extensões muito bem implementadas para o UIColor.
Especificamente, ele tem uma função lighten como parte de sua implementação HSL:
(UIColor *)lighten:(CGFloat)amount
- que funciona perfeitamente.fonte
Sebyddd
solução como uma extensão:Uso:
fonte
Se você deseja que a solução do user529758 funcione com tons de cinza (como
[UIColor lightGrayColor]
ou[UIColor darkGrayColor]
você precisa aprimorá- la assim:getHue:saturation:brightness:alpha
falha (e retornafalse
) quando chamado em um tom cinza, portanto, você precisará usá-logetWhite:alpha
.fonte
UIColor extensão e fixação mais leveColorForColor
fonte
Todas as outras respostas neste segmento usam o sistema de cores RGB ou simplesmente alteram o valor da tonalidade ou brilho do sistema HSB . Conforme explicado em detalhes neste ótimo post, a maneira correta de tornar uma cor mais clara ou mais escura é alterar seu
luminance
valor. Nenhuma das outras respostas faz isso. Se você quiser fazer o certo, use minha solução ou escreva a sua própria depois de ler a postagem do blog.Infelizmente, é um incômodo alterar qualquer um dos atributos de um UIColor por padrão . Além disso, a Apple nem suporta qualquer espaço de cores baseado em LAB como HCL na
UIColor
classe (oL
LAB é oluminance
valor que estamos procurando).Usando HandyUIKit (instalá-lo via Cartago) adiciona suporte para HCL e faz a sua vida muito mais fácil :
Há também uma opção para aplicar uma alteração relativa (recomendada):
Observe que o HandyUIKit também adiciona outros recursos úteis da interface do usuário ao seu projeto - consulte o README no GitHub para obter mais detalhes.
Espero que ajude!
fonte
Não tenho certeza se você está procurando algum tipo de resposta Objective-C, mas com base em como as cores especificadas pelo RGBA funcionam, acho que você pode simplesmente escalar os valores RGB de acordo com um fator arbitrário para obter um "mais claro" ou sombra "mais escura". Por exemplo, você pode ter um azul:
Quer um azul mais escuro? Multiplique os valores RGB por 0,9:
Voila. Ou talvez você tenha uma laranja:
Escolha outro fator de escala, digamos, 0,8:
Esse é o tipo de efeito que você está procurando?
fonte
Testado no Xcode 10 com Swift 4.x para iOS 12
Comece com sua cor como um UIColor e escolha um fator de escurecimento (como um CGFloat)
O tipo CGColor possui um valor opcional
components
que divide a cor em RGBA (como uma matriz CGFloat com valores entre 0 e 1). Você pode reconstruir um UIColor usando valores RGBA retirados do CGColor e manipulá-los.Neste exemplo, cada uma das valusas RGB foi dividida por 2, deixando a cor meio escura como era antes. O valor alfa permaneceu o mesmo, mas você pode aplicar o fator mais escuro no valor alfa, em vez do RGB.
fonte
Swift 5
fonte
Idealmente, as funções devem ser encapsuladas dentro de uma
UIColor
extensão chamadaUIColor+Brightness.swift
, e ter um brilho configurável - veja o exemplo abaixo:fonte
Eu processo células coloridas com base em um valor de status:
Para isso, escrevi uma extensão rápida com base em algum código objc antigo, depois que recebi um erro usando a sugestão do CryingHippo:
O mesmo funciona
NSColor
também. Simplesmente substituaUIColor
porNSColor
.fonte
Aqui está uma categoria UIColor que também permite controle sobre a quantidade de alteração de cor.
fonte
Uma extensão Swift baseada na resposta @Sebyddd:
fonte
para cores mais escuras, isso é o mais simples: theColor = [theColor shadowWithLevel: s]; //s.0.0 a 1.0
fonte