UIColorをグラデーションにできるようにしようとしていました。これを行うつもりの方法は、Core Graphicsを使用してグラデーションを描画することです。私がやろうとしていることは、色を取得することです。
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
いくつかの色合いが暗く、いくつかの色合いが明るいUIColorを取得します。誰でもこれを行う方法を知っていますか?ありがとうございました。
UIColorをグラデーションにできるようにしようとしていました。これを行うつもりの方法は、Core Graphicsを使用してグラデーションを描画することです。私がやろうとしていることは、色を取得することです。
[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
いくつかの色合いが暗く、いくつかの色合いが明るいUIColorを取得します。誰でもこれを行う方法を知っていますか?ありがとうございました。
回答:
- (UIColor *)lighterColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
green:MIN(g + 0.2, 1.0)
blue:MIN(b + 0.2, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColorForColor:(UIColor *)c
{
CGFloat r, g, b, a;
if ([c getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
green:MAX(g - 0.2, 0.0)
blue:MAX(b - 0.2, 0.0)
alpha:a];
return nil;
}
次のように使用します。
UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];
編集:@Anchu Chimalaが指摘したように、最大限の柔軟性を得るには、これらのメソッドをUIColorカテゴリとして実装する必要があります。また、@ Rileyのアイデアから、定数値を加算または減算する代わりに、色を比例的に暗くまたは明るくする方が良いかもしれません。@jrturtonが指摘したように、RGBコンポーネントを操作する必要はありません。輝度プロパティ自体を変更することをお勧めします。概して:
@implementation UIColor (LightAndDark)
- (UIColor *)lighterColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [UIColor colorWithHue:h
saturation:s
brightness:MIN(b * 1.3, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
return [UIColor colorWithHue:h
saturation:s
brightness:b * 0.75
alpha:a];
return nil;
}
@end
getHue:saturation:brightness
UIKit の署名にもかかわらず、HSBではなくHSVで動作するようです。このコンテキストで明るさ(実際には値)を変更しても機能しません。たとえば、純粋な赤(rgb(255,0,0))の明るさ/値は1になるため、明るさ全体を明るくすることはできません。代わりに、RGB値の変更を処理することになりました。
getHue:saturation:brightness:alpha
FALSEを返します。
luminance
extension UIColor {
var lighterColor: UIColor {
return lighterColor(removeSaturation: 0.5, resultAlpha: -1)
}
func lighterColor(removeSaturation val: CGFloat, resultAlpha alpha: CGFloat) -> UIColor {
var h: CGFloat = 0, s: CGFloat = 0
var b: CGFloat = 0, a: CGFloat = 0
guard getHue(&h, saturation: &s, brightness: &b, alpha: &a)
else {return self}
return UIColor(hue: h,
saturation: max(s - val, 0.0),
brightness: b,
alpha: alpha == -1 ? a : alpha)
}
}
使用法:
let lightColor = somethingDark.lighterColor
- (UIColor *)lighterColorRemoveSaturation:(CGFloat)removeS
resultAlpha:(CGFloat)alpha {
CGFloat h,s,b,a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return [UIColor colorWithHue:h
saturation:MAX(s - removeS, 0.0)
brightness:b
alpha:alpha == -1? a:alpha];
}
return nil;
}
- (UIColor *)lighterColor {
return [self lighterColorRemoveSaturation:0.5
resultAlpha:-1];
}
@rchampourlierは@ user529758へのコメントで正しかった(受け入れられた回答)-HSB(またはHSV)とRGBソリューションはまったく異なる結果をもたらします。RGBは白を追加する(または色を近づける)だけで、HSBソリューションは色を明るさスケールの端に近づけます-基本的に黒で始まり、純粋な色で終わります...
基本的に明るさ(値)は、色を黒に近づけたり、近づけたりしますが、彩度は、白に近づけたり狭めたりします。
ここに見られるように:
したがって、色を実際に明るくする(つまり、白に近づける)ための解決策は、彩度の値を小さくすることであり、結果としてこの解決策が得られます。
- (UIColor *)lighterColor {
CGFloat h,s,b,a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return [UIColor colorWithHue:h
saturation:MAX(s - 0.3, 0.0)
brightness:b /*MIN(b * 1.3, 1.0)*/
alpha:a];
}
return nil;
}
getHueを使用したiOSおよびOS X用のSwiftユニバーサル拡張:
#if os(OSX)
import Cocoa
public typealias PXColor = NSColor
#else
import UIKit
public typealias PXColor = UIColor
#endif
extension PXColor {
func lighter(amount : CGFloat = 0.25) -> PXColor {
return hueColorWithBrightnessAmount(1 + amount)
}
func darker(amount : CGFloat = 0.25) -> PXColor {
return hueColorWithBrightnessAmount(1 - amount)
}
private func hueColorWithBrightnessAmount(amount: CGFloat) -> PXColor {
var hue : CGFloat = 0
var saturation : CGFloat = 0
var brightness : CGFloat = 0
var alpha : CGFloat = 0
#if os(iOS)
if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {
return PXColor( hue: hue,
saturation: saturation,
brightness: brightness * amount,
alpha: alpha )
} else {
return self
}
#else
getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
return PXColor( hue: hue,
saturation: saturation,
brightness: brightness * amount,
alpha: alpha )
#endif
}
}
使用法 :
let color = UIColor(red: 0.5, green: 0.8, blue: 0.8, alpha: 1.0)
color.lighter(amount:0.5)
color.darker(amount:0.5)
または(デフォルト値を使用):
color.lighter()
color.darker()
サンプル :
let color = usingColorSpaceName(NSCalibratedRGBColorSpace)
した後、置換getHue
色を呼び出して通話を:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
_
単語の前のaがありません。する必要がありますprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
RGBで同じ結果を出したかっただけです
グラデーションサイズのx%で、「カラーから白」または「カラーから黒」のグラデーションで色を選択するよりも、同じ結果が得られます。
そのため、計算は簡単です。
extension UIColor {
func mix(with color: UIColor, amount: CGFloat) -> UIColor {
var red1: CGFloat = 0
var green1: CGFloat = 0
var blue1: CGFloat = 0
var alpha1: CGFloat = 0
var red2: CGFloat = 0
var green2: CGFloat = 0
var blue2: CGFloat = 0
var alpha2: CGFloat = 0
getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)
return UIColor(
red: red1 * (1.0 - amount) + red2 * amount,
green: green1 * (1.0 - amount) + green2 * amount,
blue: blue1 * (1.0 - amount) + blue2 * amount,
alpha: alpha1
)
}
}
ここにいくつかの色の例があります
Swiftでのuser529758のソリューション:
暗い色:
func darkerColorForColor(color: UIColor) -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if color.getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
}
return UIColor()
}
より明るい色:
func lighterColorForColor(color: UIColor) -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if color.getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
}
return UIColor()
}
var darker: UIColor
ます。
RGBカラーをHSLカラーモデルに変換すると、L =明度コンポーネントをL = 0.0(黒)からL = 0.5(自然色)からL = 1.0(白)に変更できます。UIColor
はHSLを直接処理できませんが、RGB <-> HSLを変換するための式があります。
Sebyddd
拡張としてのソリューション:
extension UIColor {
func darker() -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if self.getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
}
return UIColor()
}
func lighter() -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if self.getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
}
return UIColor()
}
}
使用法:
let darkerYellow = UIColor.yellow.darker()
let lighterYellow = UIColor.yellow.lighter()
user529758のソリューションを灰色のシェードで動作させたい場合([UIColor lightGrayColor]
または、[UIColor darkGrayColor]
次のように改善する必要があります:
- (UIColor *)lighterColor
{
CGFloat h, s, b, a;
if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return [UIColor colorWithHue:h
saturation:s
brightness:MIN(b * 1.3, 1.0)
alpha:a];
}
CGFloat white, alpha;
if ([self getWhite:&white alpha:&alpha]) {
white = MIN(1.3*white, 1.0);
return [UIColor colorWithWhite:white alpha:alpha];
}
return nil;
}
getHue:saturation:brightness:alpha
false
グレーの色合いで呼び出された場合、失敗し、戻りますgetWhite:alpha
。したがって、を使用する必要があります。
UIColor拡張とlighterColorForColorの修正
extension UIColor {
class func darkerColorForColor(color: UIColor) -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if color.getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
}
return UIColor()
}
class func lighterColorForColor(color: UIColor) -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if color.getRed(&r, green: &g, blue: &b, alpha: &a){
let tmpColor = UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
println(tmpColor)
return tmpColor
}
return UIColor()
}
}
このスレッドの他のすべての回答では、RGBカラーシステムを使用するか、HSBシステムの色相または明るさの値を変更します。で詳細に説明したように、この偉大なブログ投稿の正しい色を明るくしたり暗くが変更することである作る方法luminance
値を。他の答えのどれもそれをしません。あなたがそれを正しくしたいなら、私のブログの記事を読んだ後、私の解決策を使うか、自分で書いてください。
残念ながら、デフォルトで UIColorの属性を変更するのはかなり面倒です。また、AppleはHCLのようなLABベースの色空間もUIColor
クラスでサポートしていません(L
LAB内luminance
が探している値です)。
使用HandyUIKit(カルタゴを経由してそれをインストールすること)のためのサポートを追加しHCL、あなたの人生を作る非常に簡単:
import HandyUIKit
let color = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)
// create a new UIColor object with a specific luminance (slightly lighter)
color.change(.luminance, to: 0.7)
相対的な変更を適用するオプションもあります(推奨)。
// create a new UIColor object with slightly darker color
color.change(.luminance, by: -0.2)
HandyUIKitは他の便利なUI機能もプロジェクトに追加します。詳細については、GitHubのREADMEを確認してください。
お役に立てば幸いです。
何らかのObjective-Cの答えを探しているかどうかはわかりませんが、RGBAで指定された色がどのように機能するかに基づいて、任意の要素に従ってRGB値を単純にスケーリングし、「ライター」または「暗い」色合い。たとえば、青があるとします。
[UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];
濃い青が必要ですか?RGB値に0.9を掛けます。
[UIColor colorWithRed:0.0 green:0.0 blue:0.9 alpha:1.0];
出来上がり。または多分あなたはオレンジを持っています:
[UIColor colorWithRed:1.0 green:0.4 blue:0.0 alpha:1.0];
別の倍率、たとえば0.8を選択します。
[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];
それはあなたが求めている種類の効果ですか?
Xcode 10とSwift 4.x for iOS 12でテスト済み
UIColorとしての色から始めて、(CGFloatとして)暗くなる要素を選択します
let baseColor = UIColor.red
let darkenFactor: CGFloat = 2
タイプCGColorにはcomponents
、色をRGBAに分解するオプションの値があります(0と1の間の値を持つCGFloat配列として)。次に、CGColorから取得したRGBA値を使用してUIColorを再構築し、それらを操作できます。
let darkenedBase = UIColor(displayP3Red: startColor.cgColor.components![0] / darkenFactor, green: startColor.cgColor.components![1] / darkenFactor, blue: startColor.cgColor.components![2] / darkenFactor, alpha: 1)
この例では、各RGB値を2で除算して、色を以前の半分に暗くしました。アルファ値は同じままでしたが、RGBではなくアルファ値に暗化係数を適用することもできます。
スウィフト5
extension UIColor {
func lighter(by percentage:CGFloat=30.0) -> UIColor? {
return self.adjust(by: abs(percentage) )
}
func darker(by percentage:CGFloat=30.0) -> UIColor? {
return self.adjust(by: -1 * abs(percentage) )
}
func adjust(by percentage:CGFloat=30.0) -> UIColor? {
var r:CGFloat=0, g:CGFloat=0, b:CGFloat=0, a:CGFloat=0;
if(self.getRed(&r, green: &g, blue: &b, alpha: &a)){
return UIColor(red: min(r + percentage/100, 1.0),
green: min(g + percentage/100, 1.0),
blue: min(b + percentage/100, 1.0),
alpha: a)
}else{
return nil
}
}
}
理想的には、関数はとUIColor
呼ばれる拡張機能内にカプセル化されUIColor+Brightness.swift
、構成可能な明るさを持つ必要があります-以下の例を参照してください:
import UIKit
extension UIColor {
func lighterColorWithBrightnessFactor(brightnessFactor:CGFloat) -> UIColor {
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if self.getRed(&r, green:&g, blue:&b, alpha:&a) {
return UIColor(red:min(r + brightnessFactor, 1.0),
green:min(g + brightnessFactor, 1.0),
blue:min(b + brightnessFactor, 1.0),
alpha:a)
}
return UIColor()
}
}
ステータス値に基づいて色付きのセルをレンダリングします。
このため、CryingHippoの提案を使用してエラーが発生した後、いくつかの古いobjcコードに基づいて迅速な拡張機能を作成しました。
extension UIColor{
func darker(darker: CGFloat) -> UIColor{
var red: CGFloat = 0.0
var green: CGFloat = 0.0
var blue: CGFloat = 0.0
if self.colorSpace == UIColorSpace.genericGrayColorSpace(){
red = whiteComponent - darker
green = whiteComponent - darker
blue = whiteComponent - darker
} else {
red = redComponent - darker
green = greenComponent - darker
blue = blueComponent - darker
}
if red < 0{
green += red/2
blue += red/2
}
if green < 0{
red += green/2
blue += green/2
}
if blue < 0{
green += blue/2
red += blue/2
}
return UIColor(
calibratedRed: red,
green: green,
blue: blue,
alpha: alphaComponent
)
}
func lighter(lighter: CGFloat) -> UIColor{
return darker(-lighter)
}
}
同様に機能しNSColor
ます。単純に置き換えるUIColor
とNSColor
。
以下は、色の変化量を制御できるUIColorカテゴリです。
- (UIColor *)lighterColorWithDelta:(CGFloat)delta
{
CGFloat r, g, b, a;
if ([self getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MIN(r + delta, 1.0)
green:MIN(g + delta, 1.0)
blue:MIN(b + delta, 1.0)
alpha:a];
return nil;
}
- (UIColor *)darkerColorWithDelta:(CGFloat)delta
{
CGFloat r, g, b, a;
if ([self getRed:&r green:&g blue:&b alpha:&a])
return [UIColor colorWithRed:MAX(r - delta, 0.0)
green:MAX(g - delta, 0.0)
blue:MAX(b - delta, 0.0)
alpha:a];
return nil;
}
@Sebydddの回答に基づくSwift拡張:
import Foundation
import UIKit
extension UIColor{
func colorWith(brightness: CGFloat) -> UIColor{
var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
if getRed(&r, green: &g, blue: &b, alpha: &a){
return UIColor(red: max(r + brightness, 0.0), green: max(g + brightness, 0.0), blue: max(b + brightness, 0.0), alpha: a)
}
return UIColor()
}
}