web-gelistirme-sc.com

UIColor'dan Hafif Açık ve Koyu Renk Olun

Herhangi bir UIColor'u degradeye dönüştürebilmeyi düşünüyordum. Bunu yapmak istediğim yol, bir degrade çizmek için Çekirdek Grafikleri kullanmak. Yapmaya çalıştığım şey bir renk elde etmek, diyelim:

[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

ve birkaç ton koyu, birkaç ton daha açık olan bir UIColor'a sahip olun. Bunu nasıl yapacağını bilen var mı? Teşekkür ederim.

139
CoreCode
- (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;
}

Bu şekilde kullanın:

UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];

EDIT: @Anchu Chimala, maksimum esneklik için bu yöntemlerin bir UIColor kategorisi olarak uygulanması gerektiğini belirtti. Ayrıca, @ Riley'nin fikrinden, sabit değerler eklemek veya çıkarmak yerine rengi daha koyu veya açık yapmak daha iyi bir fikir olabilir. Jrturton'un işaret ettiği gibi, RGB bileşenlerini değiştirmek gerekli değildir; parlaklık özelliğini kendisi değiştirmek daha iyidir. Neticede:

@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
273
user529758

TL; DR:

Swift:

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)
    }
}

Kullanımı:

let lightColor = somethingDark.lighterColor

Objective-C:

- (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, yorumunda @ user529758'e haklıydı (Kabul edilen cevap) - HSB (Veya HSV) ve RGB çözümleri, tamamen farklı sonuçlar veriyor. RGB sadece beyaza ekler (veya rengi yaklaştırır) ve HSB çözümü rengi temelde siyahla başlayan ve saf renkle biten Brigtness ölçeğinde Edge'e yaklaştırır ...

Temel olarak Parlaklık (Değer), rengi siyaha daha az veya çok yaklaştırır; 

Burada görüldüğü gibi:

HSV color graph

Böylece bir rengi gerçekten daha parlak hale getirmenin çözümü (yani beyaza daha yakın ...), bu doygunluk değerini daha küçük yapmak olacaktır, bu da bu çözüme yol açar:

- (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;
}
51
Aviel Gross

SwiftiOS ve OS X için evrensel uzantı, getHue kullanarak

#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

    }

}

Kullanım: 

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)

VEYA (varsayılan değerlerle):

color.lighter()
color.darker()

Numune : 

enter image description here

37
CryingHippo

user529758'in Swift'deki çözümü:  

Daha koyu renk:

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()
}

Daha açık renk:

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()
}
23
Sebyddd

Ben de aynı sonucu RGB’de vermek istedim.

  • rengini alfa x% ile beyazlaştırmak için beyaz bir arka plan üzerine yerleştirmek
  • rengi alfa x% ile karartmak için siyah bir arka plan üzerine yerleştirmek

Bu aynı sonucu verir; AFAIK, rengi gradyan boyutunun% x'inde 'renkten beyaza' veya 'renkten siyaha' renklendirmek yerine.

Bu amaçla, matematik basittir:

// UIColor+Mix.Swift
import UIKit
extension UIColor {

    func mixLighter (amount: CGFloat = 0.25) -> UIColor {
        return mixWithColor(UIColor.whiteColor(), amount:amount)
    }

    func mixDarker (amount: CGFloat = 0.25) -> UIColor {
        return mixWithColor(UIColor.blackColor(), amount:amount)
    }

    func mixWithColor(color: UIColor, amount: CGFloat = 0.25) -> UIColor {
        var r1     : CGFloat = 0
        var g1     : CGFloat = 0
        var b1     : CGFloat = 0
        var alpha1 : CGFloat = 0
        var r2     : CGFloat = 0
        var g2     : CGFloat = 0
        var b2     : CGFloat = 0
        var alpha2 : CGFloat = 0

        self.getRed (&r1, green: &g1, blue: &b1, alpha: &alpha1)
        color.getRed(&r2, green: &g2, blue: &b2, alpha: &alpha2)
        return UIColor( red:r1*(1.0-amount)+r2*amount,
                        green:g1*(1.0-amount)+g2*amount,
                        blue:b1*(1.0-amount)+b2*amount,
                        alpha: alpha1 )
    }
}

İşte bazı renkler ile örnekler

 Examples Darker and Lighter

19
FredericP

RGB rengini HSL renk modeline / dönüştürürseniz, L = hafiflik bileşenini L = 0.0 (siyah) üzerinde L = 0.5 (doğal renk) ila L = 1.0 (beyaz) arasında değiştirebilirsiniz. UIColor, HSL'yi doğrudan işleyemez, ancak RGB <-> HSL'yi dönüştürmek için bir formül vardır. 

13
Martin R

Yayınlanan çözümlerin hiçbiri oldukça tüm renkler ve gölgeler için işe yaramadı, ancak daha sonra UIColor için çok iyi uygulanmış bir dizi uzantı sağlayan bu kitaplık öğesine rastladım. 

Özellikle, HSL uygulamasının bir parçası olarak hafifletme işlevi vardır: (UIColor *)lighten:(CGFloat)amount - ki mükemmel çalışır.

6
Terminus

UIColor uzatma ve sabitleme çakmağıColorForColor

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()
  }
}
2
Justin Levi Winter

Sebyddd bir uzantısı olarak çözüm:

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()
    }
}

Kullanım:

let darkerYellow = UIColor.yellow.darker()
let lighterYellow = UIColor.yellow.lighter()
2
Hemang

Kullanıcının529758'in çözümünün gri tonlarla çalışmasını istiyorsanız ([UIColor lightGrayColor] veya [UIColor darkGrayColor] gibi) şöyle geliştirmelisiniz: 

- (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 gri bir gölgede çağrıldığında başarısız olur (ve false değerini döndürür), bu nedenle getWhite:alpha kullanmanız gerekir. 

2
Matthieu Riegler

Bir tür Objective-C cevabı arıyorsanız emin değilim, ancak RGBA tarafından belirtilen renklerin nasıl çalıştığına bağlı olarak, RGB değerlerini "daha hafif" veya "daha koyu" gölge. Örneğin, maviniz olabilir:

[UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];

Koyu mavi ister misin? RGB değerlerini 0,9 ile çarpın:

[UIColor colorWithRed:0.0 green:0.0 blue:0.9 alpha:1.0];

Voila. Ya da belki bir portakalın var:

[UIColor colorWithRed:1.0 green:0.4 blue:0.0 alpha:1.0];

Başka bir ölçek faktörü seçin, örneğin 0.8:

[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];

Aradığın etki bu mu?

1
ravron

İdeal olarak, işlevler UIColor+Brightness.Swift adı verilen UIColor uzantısının içine yerleştirilmelidir ve yapılandırılabilir bir parlaklığa sahip olmalıdır - aşağıdaki örneğe bakın:

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()
  }

}
0
Zorayr

Renk değişiminin miktarı üzerinde kontrol sağlayan bir UIColor kategorisi.

- (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;
}
0
Blago

@Sebyddd cevabını temel alan Swift uzantısı:

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()
    }
}
0
Balázs Vincze

koyu renk için bu en basittir: theColor = [theColor shadowWithLevel: s]; //s:0.0 - 1.0

0
Jiulong Zhao

iOS 12 için Swift 4.x ile Xcode 10'da test edildi

Renginizle bir UIColor olarak başlayın ve kararan bir faktör seçin (CGFloat olarak)

let baseColor = UIColor.red
let darkenFactor: CGFloat = 2

CGColor tipi, rengi RGBA'ya ayıran isteğe bağlı bir components değerine sahiptir (0 ile 1 arasında değerler içeren bir CGFloat dizisi olarak). CGColor'dan alınan RGBA değerlerini kullanarak bir UIColor'u yeniden oluşturabilir ve değiştirebilirsiniz.

let darkenedBase = UIColor(displayP3Red: startColor.cgColor.components![0] / darkenFactor, green: startColor.cgColor.components![1] / darkenFactor, blue: startColor.cgColor.components![2] / darkenFactor, alpha: 1)

Bu örnekte, RGB değerlerinin her biri 2'ye bölünerek rengi öncekinin yarısı kadar karanlık yaptı. Alfa değeri aynı kaldı, ancak alternatif olarak karartma faktörünü RGB yerine alfa değerine de uygulayabilirsiniz. 

0
Microbob

Durum değerine göre renkli hücreler yapıyorum:

status-images

Bunun için CryingHippo'nun önerisini kullanırken hata yaptıktan sonra bazı eski objc kodlarına dayanan bir Swift uzantısı yazdım:

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)
    }
}

Aynı NSColor için de geçerlidir. Basitçe UIColor, NSColor ile değiştirin.

0
Besi