Je cherchais à transformer n'importe quel UIColor en dégradé. La façon dont j'ai l'intention de le faire est d'utiliser Core Graphics pour dessiner un dégradé. Ce que j'essaie de faire, c'est d'obtenir une couleur, disons:
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
et obtenez un UIColor qui est quelques nuances plus foncées et quelques nuances plus claires. Est-ce que quelqu'un sait comment faire ça? Je vous remercie.
objective-c
ios
core-graphics
gradient
uicolor
CoreCode
la source
la source
Réponses:
Utilisez-le comme ceci:
EDIT : comme @Anchu Chimala l'a souligné, pour une flexibilité maximale, ces méthodes devraient être implémentées en tant que catégorie UIColor. De plus, d'après l'idée de @ Riley, il peut être préférable de rendre la couleur proportionnellement plus sombre ou plus claire au lieu d'ajouter ou de soustraire des valeurs constantes. Comme @jrturton l'a souligné, il n'est pas nécessaire de manipuler les composants RVB; il est préférable de modifier la propriété de luminosité elle-même. En tout:
la source
getHue:saturation:brightness
signature d'UIKit, il semble que cela fonctionne avec HSV au lieu de HSB. Modifier la luminosité (donc en fait la valeur) dans ce contexte ne fonctionnera pas. Par exemple, le rouge pur (rgb (255,0,0)) aura une luminosité / valeur de 1, rendant ainsi l'éclaircissement par la luminosité impossible. J'ai fini par travailler avec des changements sur les valeurs RVB à la place.getHue:saturation:brightness:alpha
retournera FALSE.luminance
valeur de l'espace colorimétrique LAB est la vraie valeur à laquelle vous devez vous soucier lorsque vous éclaircissez / assombrissez les couleurs. Voir ma réponse sur la façon dont vous pouvez en tirer parti et résoudre ce problème de la bonne manière.TL; DR:
Rapide:
Usage:
Objectif c:
@rchampourlier avait raison dans son commentaire à @ user529758 (La réponse acceptée) - Les solutions HSB (ou HSV) et RVB donnent des résultats complètement différents. RVB ajoute simplement (ou rapproche la couleur du) blanc, et la solution HSB rapproche la couleur du bord de l'échelle de Brigtness - qui commence essentiellement par le noir et se termine par la couleur pure ...
Fondamentalement, la luminosité (valeur) rend la couleur plus ou moins proche du noir, où la saturation la rend moins ou plus proche du blanc ...
Comme vu ici:
Donc , la solution pour rendre une couleur plus claire en fait ( par exemple plus proche de blanc ...) sera de rendre sa valeur de saturation plus petite , ce qui cette solution:
la source
Extension universelle Swift pour iOS et OS X , utilisant getHue :
Utilisation:
OU (avec les valeurs par défaut):
Échantillon :
la source
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
puis en remplaçant l'getHue
appel par un appel à la couleur:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
avant le mot montant. Devrait êtreprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Je voulais juste donner le même résultat, en RVB, que
Ce qui donne le même résultat, AFAIK, que de choisir la couleur dans un dégradé «couleur au blanc» ou «couleur au noir», à x% de la taille du dégradé.
Pour cela, le calcul est simple:
Voici des exemples avec quelques couleurs
la source
La solution de user529758 dans Swift:
Couleur plus foncée:
Couleur plus claire:
la source
var darker: UIColor
par exemple.Si vous convertissez la couleur RVB en modèle de couleur TSL, vous pouvez faire varier la composante L = luminosité de L = 0,0 (noir) sur L = 0,5 (couleur naturelle) à L = 1,0 (blanc).
UIColor
ne peut pas gérer directement HSL, mais il existe une formule pour convertir RVB <-> HSL.la source
Aucune des solutions posté tout à fait travaillé pour toutes les couleurs et les nuances, mais je suis tombée sur cette bibliothèque qui fournit un ensemble d'extensions très bien mis en œuvre pour UIColor.
Plus précisément, il a une fonction allégée dans le cadre de sa mise en œuvre HSL:
(UIColor *)lighten:(CGFloat)amount
- qui fonctionne parfaitement.la source
Sebyddd
solution comme extension:Usage:
la source
Si vous voulez que la solution de user529758 fonctionne avec des nuances de gris (comme
[UIColor lightGrayColor]
ou[UIColor darkGrayColor]
vous devez l'améliorer comme ça:getHue:saturation:brightness:alpha
échoue (et retournefalse
) lorsqu'il est appelé sur une nuance grise, vous devrez donc utilisergetWhite:alpha
.la source
Extension UIColor et briquet de fixationColorForColor
la source
Toutes les autres réponses de ce fil utilisent le système de couleurs RVB ou modifient simplement la teinte ou la valeur de luminosité du système HSB . Comme expliqué en détail dans cet excellent article de blog, la bonne façon de rendre une couleur plus claire ou plus foncée est de changer sa
luminance
valeur. Aucune des autres réponses ne fait cela. Si vous voulez bien faire les choses, utilisez ma solution ou écrivez la vôtre après avoir lu le billet de blog.Malheureusement, il est assez compliqué de changer l'un des attributs d'un UIColor par défaut . De plus, Apple ne prend même pas en charge les espaces colorimétriques basés sur LAB comme HCL dans la
UIColor
classe (la valeurL
dans LAB est laluminance
valeur que nous recherchons).En utilisant HandyUIKit ( l' installer via Carthage) ajoute le support pour HCL et rend votre vie beaucoup plus facile :
Il existe également une option pour appliquer un changement relatif (recommandé):
Notez que HandyUIKit ajoute également d' autres fonctionnalités d'interface utilisateur pratiques dans votre projet - consultez son README sur GitHub pour plus de détails.
J'espère que ça aide!
la source
Je ne sais pas si vous recherchez une sorte de réponse Objective-C, mais en fonction du fonctionnement des couleurs spécifiées par RGBA, je pense que vous pouvez simplement mettre à l'échelle les valeurs RVB en fonction d'un facteur arbitraire pour obtenir un "plus clair" ou teinte "plus foncée". Par exemple, vous pourriez avoir un bleu:
Envie d'un bleu plus foncé? Multipliez les valeurs RVB par 0,9:
Voila. Ou peut-être avez-vous une orange:
Choisissez un autre facteur d'échelle, disons 0,8:
Est-ce le genre d'effet que vous recherchez?
la source
Testé dans Xcode 10 avec Swift 4.x pour iOS 12
Commencez avec votre couleur comme UIColor et choisissez un facteur d'assombrissement (comme CGFloat)
Le type CGColor a une valeur facultative
components
qui décompose la couleur en RGBA (sous forme de tableau CGFloat avec des valeurs comprises entre 0 et 1). Vous pouvez ensuite reconstruire un UIColor en utilisant des valeurs RGBA extraites du CGColor et les manipuler.Dans cet exemple, chacune des valeurs RVB a été divisée par 2, ce qui rend la couleur deux fois moins sombre qu'auparavant. La valeur alpha est restée la même, mais vous pouvez également appliquer le facteur d'assombrissement sur la valeur alpha plutôt que sur RVB.
la source
Swift 5
la source
Idéalement, les fonctions doivent être encapsulées dans une
UIColor
extension appeléeUIColor+Brightness.swift
, et avoir une luminosité configurable - voir l'exemple ci-dessous:la source
Je rend les cellules colorées en fonction d'une valeur de statut:
Pour cela, j'ai écrit une extension rapide basée sur un ancien code objc après avoir reçu une erreur en utilisant la suggestion de CryingHippo:
La même chose fonctionne
NSColor
également. Remplacez simplementUIColor
parNSColor
.la source
Voici une catégorie UIColor qui permet également de contrôler la quantité de changement de couleur.
la source
Une extension Swift basée sur la réponse @Sebyddd:
la source
pour une couleur plus foncée, c'est la plus simple: theColor = [theColor shadowWithLevel: s]; //s:0.0 à 1.0
la source