8

であるcolorAと。[UIColor blueColor]であるcolorBがあり[UIColor redColor]ます。これは私がレンダリングすることは可能[UIColor purple]ですか?どのように実装できますか?ありがとう。

4

6 に答える 6

30

エレガントではありませんが、機能します:

UIColor* blend( UIColor* c1, UIColor* c2, float alpha )
{
    alpha = MIN( 1.f, MAX( 0.f, alpha ) );
    float beta = 1.f - alpha;
    CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
    [c1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
    [c2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
    CGFloat r = r1 * beta + r2 * alpha;
    CGFloat g = g1 * beta + g2 * alpha;
    CGFloat b = b1 * beta + b2 * alpha;
    return [UIColor colorWithRed:r green:g blue:b alpha:1.f];
}

よりエレガント:

UIColor + Extensions.h:

@interface UIColor (Extensions)

- (UIColor*)blendWithColor:(UIColor*)color2 alpha:(CGFloat)alpha2;

@end

UIColor + Extensions.m:

@implementation UIColor (Extensions)

- (UIColor*)blendWithColor:(UIColor*)color2 alpha:(CGFloat)alpha2
{
    alpha2 = MIN( 1.0, MAX( 0.0, alpha2 ) );
    CGFloat beta = 1.0 - alpha2;
    CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
    [self getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
    [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
    CGFloat red     = r1 * beta + r2 * alpha2;
    CGFloat green   = g1 * beta + g2 * alpha2;
    CGFloat blue    = b1 * beta + b2 * alpha2;
    CGFloat alpha   = a1 * beta + a2 * alpha2;
    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

@end

Swift 3/4:

extension UIColor
{
func mixin(infusion:UIColor, alpha:CGFloat) -> UIColor {
    let alpha2 = min(1.0, max(0, alpha))
    let beta = 1.0 - alpha2

    var r1:CGFloat = 0, r2:CGFloat = 0
    var g1:CGFloat = 0, g2:CGFloat = 0
    var b1:CGFloat = 0, b2:CGFloat = 0
    var a1:CGFloat = 0, a2:CGFloat = 0
    if getRed(&r1, green: &g1, blue: &b1, alpha: &a1) &&
        infusion.getRed(&r2, green: &g2, blue: &b2, alpha: &a2)
    {
        let red     = r1 * beta + r2 * alpha2;
        let green   = g1 * beta + g2 * alpha2;
        let blue    = b1 * beta + b2 * alpha2;
        let alpha   = a1 * beta + a2 * alpha2;
        return UIColor(red: red, green: green, blue: blue, alpha: alpha)
    }
    // epique de las failuree
    return self
}
}
于 2013-09-19T19:38:04.673 に答える
4

を使用して、各入力色にRGBAコンポーネントを要求します-[UIColor getRed:green:blue:alpha:]。それぞれのコンポーネントを平均し、を使用して新しい色を作成し+[UIColor colorWithRed:green:blue:alpha:]ます。

于 2012-10-30T04:48:54.847 に答える
3

Swift5UIColor 拡張機能

extension UIColor {
    func add(_ overlay: UIColor) -> UIColor {
        var bgR: CGFloat = 0
        var bgG: CGFloat = 0
        var bgB: CGFloat = 0
        var bgA: CGFloat = 0
        
        var fgR: CGFloat = 0
        var fgG: CGFloat = 0
        var fgB: CGFloat = 0
        var fgA: CGFloat = 0
        
        self.getRed(&bgR, green: &bgG, blue: &bgB, alpha: &bgA)
        overlay.getRed(&fgR, green: &fgG, blue: &fgB, alpha: &fgA)
        
        let r = fgA * fgR + (1 - fgA) * bgR
        let g = fgA * fgG + (1 - fgA) * bgG
        let b = fgA * fgB + (1 - fgA) * bgB
        
        return UIColor(red: r, green: g, blue: b, alpha: 1.0)
    }
    
    static func +(lhs: UIColor, rhs: UIColor) -> UIColor {
        return lhs.add(rhs)
    }
}

使用法

let opacity: CGFloat = 0.6
let start = UIColor.red
let end = UIColor.blue
let combined = start.withAlphaComponent(opacity) + end.withAlphaComponent(1-opacity)
于 2020-08-07T07:38:50.310 に答える
1

2020年になり、「ダークモード」が利用できるようになったため、多くの「色」はもはや単なる色ではなく、色の変化に自動的に適応します。これらは、UIColor(dynamicProvider:...)を呼び出すことによって作成されます。

両方の色が動的な色であるかどうかを確認し、そうである場合は動的な色を返す必要があります。1つの動的な色と非動的な色を混合することは実際には意味がないため、その場合は非動的な色を返します。

于 2020-08-07T08:05:20.477 に答える
0

質問で述べたように、2つのUIColorを直接混合することはできません。とにかく、他のスキームを使用して2つの色を混合する例があります。同じためのリンクは次のとおりです。

ここにリンク

于 2012-10-30T04:50:07.843 に答える
-1

紫色を使用したい場合は、大したことではありません。すべてのUIColorはrgb色です。各色のRGB値を渡すだけで、目的の色を取得できます。このリンクを使用して、変換する任意の色の16進値を変換します。 UIColorで。 http://www.touch-code-magazine.com/web-color-to-uicolor-convertor/

緑の#colorコードのように#008400:[UIColor colorWithRed:0 green:0.518 blue:0 alpha:1] / #008400 /

于 2012-10-30T04:52:41.917 に答える