รับสีที่จางกว่าและเข้มกว่าเล็กน้อยจาก UIColor


144

ฉันกำลังมองหาที่จะเปลี่ยน UIColor ใด ๆ ให้เป็นแบบไล่ระดับสี วิธีที่ฉันตั้งใจจะทำคือการใช้ Core Graphics ในการวาดการไล่ระดับสี สิ่งที่ฉันพยายามทำคือการได้สีมาพูดว่า:

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

และรับ UIColor ซึ่งเป็นสีไม่กี่สีเข้มขึ้นและไม่กี่สีเบา ไม่มีใครรู้วิธีการทำเช่นนี้? ขอบคุณ.


1
"การไล่ระดับสี" หมายความว่าส่วนหนึ่งของภาพของคุณจะเป็นหนึ่งเฉดสีในขณะที่อีกส่วนหนึ่งจะเป็นสีเข้มหรือจางลง นี่เป็นอีกวิธีหนึ่งในการกำหนดสิ่งที่คุณต้องการทำหรือไม่?
Michael Dautermann

2
ดูห้องสมุดนี้github.com/yannickl/DynamicColor
onmyway133

รวดเร็วโดยใช้ความอิ่มตัวของสีและความสว่างstackoverflow.com/a/30012117/2303865
Leo Dabus

คำตอบ:


279
- (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

2
ทำไมต้องใช้ RGB เมื่อคุณสามารถทำเช่นเดียวกันกับเฉดสีความอิ่มตัวความสว่างจากนั้นสร้างสีใหม่โดยที่ความสว่างเปลี่ยนไป
jrturton

2
ฉันลองใช้รุ่น HSB ด้วยตัวเองแล้ว แต่ก็ใช้งานไม่ได้ตามที่คาดไว้ แม้จะมีgetHue:saturation:brightnessลายเซ็นของ UIKit ดูเหมือนว่าจะทำงานร่วมกับ HSV แทน HSB การเปลี่ยนความสว่าง (จริง ๆ แล้วค่า) ในบริบทนี้จะไม่ทำงาน ตัวอย่างเช่นสีแดงบริสุทธิ์ (rgb (255,0,0)) จะมีความสว่าง / ค่า 1 ดังนั้นจึงไม่สามารถลดความสว่างผ่านความสว่างได้ ฉันสิ้นสุดการทำงานกับการเปลี่ยนแปลงค่า RGB แทน
rchampourlier

2
ฉันคิดว่ามีบางสิ่งที่ทำให้สับสนในคำตอบของคุณ: คุณใช้สองวิธี (หนึ่งกับ RGB และอื่น ๆ ที่มี HSB สำหรับรุ่นหมวดหมู่) ซึ่งไม่มีผลเหมือนกัน ... และนั่นอาจเป็นคำถามของ ความหมาย: การลดน้ำหนักนั้นสำหรับฉันทำให้สีมีแนวโน้มที่จะเป็นสีขาว (มืดลงไปเป็นสีดำ) ในขณะที่การเปลี่ยนความสว่าง / ค่าคือทำให้มันแข็งแกร่งขึ้น (เบาลง)
rchampourlier

4
วิธีการนี้จะล้มเหลวหากใช้กับเฉดสีเทา getHue:saturation:brightness:alphaจะคืนค่า FALSE
Matthieu Riegler

2
ผมสงสัยว่าทำไมนี้เป็นคำตอบที่ได้รับการยอมรับว่าเป็นทั้งการแก้ปัญหามีความไม่ถูกต้อง พวกเขาทั้งสองเพียงเปลี่ยนค่าทางทฤษฎีที่มีน้อยจะทำอย่างไรกับสิ่งที่มนุษย์รับรู้เป็นสี 'เบา' หรือ 'เข้ม' ฉันแนะนำให้อ่านโพสต์ที่ยอดเยี่ยมนี้ (shortlink: goo.gl/qqgk9V) เพื่อทำความเข้าใจสิ่งที่ฉันหมายถึง มันอธิบายว่าluminanceมูลค่าของพื้นที่สี LABนั้นเป็นของจริงที่คุณควรใส่ใจเมื่อทำให้สีอ่อน / เข้มขึ้น ดูคำตอบของฉันเกี่ยวกับวิธีการใช้ประโยชน์จากมันและแก้ปัญหานี้อย่างถูกวิธี
Jeehut

59

TL; DR:

สวิฟท์:

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

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 ถูกต้องในความคิดเห็นของเขาที่ @ user529758 (คำตอบที่ได้รับการยอมรับ) - โซลูชั่น HSB (หรือ HSV) และ RGB ให้ผลลัพธ์ที่แตกต่างอย่างสิ้นเชิง RGB เพิ่งเพิ่ม (หรือทำให้สีใกล้เคียงขึ้น) สีขาวและโซลูชัน HSB จะทำให้สีใกล้กับขอบมากขึ้นในระดับ Brigtness - ซึ่งโดยทั่วไปเริ่มจากสีดำและลงท้ายด้วยสีบริสุทธิ์ ...

ความสว่างโดยทั่วไป (ค่า) ทำให้สีมีความเข้มน้อยลงหรือใกล้เคียงกับสีดำมากขึ้นโดยที่ความอิ่มตัวของสีจะทำให้สีขาวใกล้เคียงยิ่งขึ้น ...

เท่าที่เห็นที่นี่:

กราฟสี HSV

ดังนั้นวิธีแก้ปัญหาที่ทำให้สีสว่างขึ้น (เช่นใกล้เคียงกับสีขาวมากขึ้น ... ) จะทำให้ค่าความอิ่มตัวของสีนั้นเล็กลงซึ่งจะทำให้วิธีนี้:

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

เกี่ยวกับการทำให้สีอ่อนลง: ฉันได้รับผลลัพธ์ที่ดีที่สุดโดยการลดความอิ่มตัวและเพิ่มความสว่าง / ค่า คำตอบนี้ใช้ได้ดีสำหรับสี "ด้านบน" ของวงกลมในภาพ แต่สีส่วนใหญ่จะตกที่ไหนสักแห่ง "ข้างใน" วงกลม การนำพวกเขาเข้ามาใกล้กับสีขาวนั้นต้องการให้พวกเขา "ขึ้น" เช่นกัน (เพิ่มมูลค่า)
pejalo

มูลค่าที่เพิ่มขึ้นอาจปรากฏขึ้นเพื่อให้ทำงานได้ แต่มันจะไม่ใช่ฟังก์ชั่น "หลัก" ของ "รับสีที่อ่อนกว่า" วิธีเดียวกันเพื่อให้ได้สีเข้มกว่าวิธีที่ถูกต้องคือลด "ค่า" เท่านั้นและปล่อยให้ความอิ่มตัวเป็นไปตามที่ ...
Aviel Gross

38

Swift universal extension สำหรับiOS และ OS Xโดยใช้getHue :

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

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่


ฉันพบข้อผิดพลาด: -getHue: saturation: ความสว่าง: alpha: ไม่ถูกต้องสำหรับ NSColor NSCalibratedWhiteColorSpace 0 1; จำเป็นต้องแปลง colorpace ก่อน
เบซิ

2
แก้ไขโดยเพิ่ม: let color = usingColorSpaceName(NSCalibratedRGBColorSpace) แล้วเปลี่ยนgetHueสายด้วยการโทรเป็นสี:color?.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
Oskar

ฟังก์ชั่นหายไป_ก่อนจำนวนคำ ควรเป็นprivate func hueColorWithBrightnessAmount(_ amount: CGFloat) -> PXColor {
Codemonk

ฉันขอแนะนำให้เพิ่มคำแนะนำของ @Oskar ให้กับคำตอบ นี่เป็นการแก้ไขข้อผิดพลาดรันไทม์สำหรับฉัน
Besi

29

ฉันแค่อยากจะให้ผลลัพธ์เดียวกันใน RGB มากกว่า

  • วางสีด้วยอัลฟา x% บนพื้นหลังสีขาวเพื่อให้จางลง
  • วางสีด้วยอัลฟา x% บนพื้นหลังสีดำเพื่อทำให้สีเข้มขึ้น

ซึ่งให้ผลแบบเดียวกัน AFAIK มากกว่าการเลือกสีใน 'การไล่ระดับสีเป็นสีขาว' หรือ 'สีเป็นสีดำ' ที่ 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
        )
    }
}

นี่คือตัวอย่างที่มีบางสี

ตัวอย่างเข้มขึ้นและจางลง


ผมคิดว่านี่คือการปฏิบัติที่ดีที่สุดโดยไม่ต้อง resorting ห้องสมุดภายนอกที่ดำเนินการพื้นที่สี HSL
มุง

24

โซลูชันของ user529758 ใน Swift:

สีเข้ม:

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

1
นี่เป็นคำตอบที่ดียกเว้นว่ามันจะสะดวกกว่าถ้ามันถูกประกาศให้เป็นส่วนเสริมของคลาส UIColor เพียงvar darker: UIColorยกตัวอย่างเช่น
Bruno Philipe

13

หากคุณแปลงสี RGB เป็นโมเดลสี HSLคุณสามารถเปลี่ยนแปลงส่วนประกอบ L = ความสว่างจาก L = 0.0 (สีดำ) มากกว่า L = 0.5 (สีธรรมชาติ) เป็น L = 1.0 (สีขาว) UIColorไม่สามารถจัดการ HSL ได้โดยตรง แต่มีสูตรสำหรับการแปลง RGB <-> HSL


ไม่ใช่ HSL แต่ HSB ใช้ได้ดี: developer.apple.com/library/ios/documentation/uikit/reference/
......

8
ความแตกต่างระหว่างแบบจำลองสี HSL และ HSB (บางครั้งเรียกว่า HSV) คือใน HSB L = 1.0 สอดคล้องกับสีที่บริสุทธิ์ขณะที่ HSL L = 1.0 สอดคล้องกับสีขาวและ L = 0.5 ถึงสีบริสุทธิ์ เนื่องจากโปสเตอร์ต้นฉบับขอให้มีวิธีทำให้สีฟ้า (RGB = 0/0/1) จางลงฉันคิดว่า HSL นั้นมีความยืดหยุ่นมากกว่า
Martin R

6

ไม่มีการแก้ปัญหาที่โพสต์ค่อนข้างทำงานให้กับทุกสีและเฉดสี แต่แล้วฉัน stumbled ข้ามห้องสมุดนี้ซึ่งมีชุดของส่วนขยายการดำเนินการเป็นอย่างดีเพื่อ UIColor

โดยเฉพาะอย่างยิ่งมันมีฟังก์ชั่นที่เบาขึ้นเป็นส่วนหนึ่งของการนำ HSL ไปใช้: (UIColor *)lighten:(CGFloat)amount- ซึ่งทำงานได้อย่างสมบูรณ์แบบ


5

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

2

หากคุณต้องการให้โซลูชันของ 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เมื่อเรียกในที่ร่มสีเทาดังนั้นคุณจะต้องใช้


2

ส่วนขยาย UIColor และการแก้ไขไฟแช็ก 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

ทุกคำตอบอื่น ๆ ในการใช้งานหัวข้อนี้ทั้งระบบสี RGBหรือเพียงแค่เปลี่ยนสีหรือความสว่างค่าของระบบ HSB ตามที่ได้อธิบายในรายละเอียดในบล็อกที่ดีนี้โพสต์ที่ถูกต้องวิธีการทำสีที่เบากว่าหรือเข้มขึ้นคือการเปลี่ยนของluminanceค่า ไม่มีคำตอบอื่นใดที่ทำเช่นนั้น หากคุณต้องการทำมันให้ถูกต้องให้ใช้วิธีแก้ปัญหาของฉันหรือเขียนเองหลังจากอ่านโพสต์บล็อก


แต่น่าเสียดายที่มันค่อนข้างยุ่งยากในการเปลี่ยนแปลงใด ๆ ของคุณลักษณะของ UIColor โดยค่าเริ่มต้น Apple ไม่แม้แต่จะสนับสนุนพื้นที่สีที่ใช้ LAB เช่น HCL ในUIColorชั้นเรียน ( Lin LAB คือluminanceค่าที่เรากำลังมองหา)

การใช้HandyUIKit (ติดตั้งผ่าน Carthage) เพิ่มการสนับสนุนสำหรับ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 ที่มีประโยชน์อื่น ๆในโครงการของคุณ - เช็คเอาต์README บน GitHubเพื่อดูรายละเอียดเพิ่มเติม

ฉันหวังว่ามันจะช่วย!


สำหรับแอพของฉันฉันวาดเส้นทางบนแผนที่ ฉันต้องการวาดเส้นทางโดยใช้เส้นสีด้านในที่มีความสว่าง 100% และเส้นขอบที่มีสีที่เข้มกว่า เพราะเส้นด้านในมีความสว่าง 100% ไม่มีวิธีการใดที่ใช้งานได้ การเปลี่ยนความส่องสว่างเช่นเดียวกับที่กล่าวไว้ข้างต้นก็ไม่ได้ทำการหลอก อย่างไรก็ตามการลดความสว่างโดยใช้ส่วนขยายที่ดีมากนี้ก็เป็นเคล็ดลับสำหรับฉัน 'color.change (.brightness, by: -0.5)' ส่วนขยายนี้มีความยืดหยุ่นในการใช้งานและมีตัวเลือกมากมาย ฉันแนะนำว่าโดยเฉพาะอย่างยิ่งถ้าคุณมีแอพที่มีหลายธีมหรือชุดจานสี
กุย

1

ฉันไม่แน่ใจว่าคุณกำลังมองหาคำตอบของ 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];

voila หรือบางทีคุณมีส้ม:

[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];

นั่นเป็นเอฟเฟกต์ที่คุณกำลังมองหาใช่ไหม


โอเคใช่นั่นคือครึ่งหนึ่งของสิ่งที่ฉันต้องการ มีวิธีการรับสีอ่อนกว่านั้นเมื่อสีน้ำเงินเป็น 1 (สูงสุด)
CoreCode

@CoreCode ไม่เลย นอกเสียจากว่าคุณต้องการเปลี่ยน birghtness ของหน้าจอของอุปกรณ์ :) ดูคำตอบของฉัน

1

ทดสอบใน Xcode 10 ด้วย Swift 4.x สำหรับ iOS 12

เริ่มต้นด้วยสีของคุณเป็น UIColor และเลือกปัจจัยทำให้มืดลง (เป็น CGFloat)

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

ประเภท CGColor มีค่าเผื่อเลือกcomponentsซึ่งแบ่งสีเป็น RGBA (เป็นอาร์เรย์ CGFloat ที่มีค่าระหว่าง 0 ถึง 1) จากนั้นคุณสามารถสร้าง UIColor อีกครั้งโดยใช้ค่า RGBA ที่นำมาจาก CGColor และจัดการค่าเหล่านั้น

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

ในตัวอย่างนี้แต่ละ RGB RGB แบ่งออกเป็น 2 ทำให้ครึ่งสีเข้มเหมือนเมื่อก่อน ค่าอัลฟายังคงเหมือนเดิม แต่คุณสามารถใช้ปัจจัยมืดลงกับค่าอัลฟาแทน RGB ได้


1

สวิฟท์ 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


     }
    }
}

0

ตามหลักการแล้วฟังก์ชั่นควรถูกห่อหุ้มภายใน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()
  }

}

0

ฉันแสดงเซลล์สีตามค่าสถานะ:

สถานะภาพ

สำหรับสิ่งนี้ฉันได้เขียนส่วนขยายที่รวดเร็วโดยใช้รหัส objc เก่าหลังจากที่ฉันพบข้อผิดพลาดโดยใช้คำแนะนำของ CryingHippo:

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เช่นกัน เพียงแทนที่ด้วยUIColorNSColor


0

นี่คือหมวดหมู่ 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;
}

0

นามสกุล Swift ตาม @Sebyddd คำตอบ:

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

-1

สำหรับสีที่เข้มกว่านี่เป็นวิธีที่ง่ายที่สุด: theColor = [theColor shadowWithLevel: s]; //s.00.0 ถึง 1.0


วิธีนี้ใช้ได้เฉพาะใน NSColor ไม่ใช่ UIColor
followben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.