【问题标题】:How to get random warm/cold color in UIColor?如何在 UIColor 中获得随机的暖色/冷色?
【发布时间】:2024-01-10 13:19:01
【问题描述】:

我想randomly 选择两种颜色。但它必须是随机的cold 颜色和随机的warm 颜色。

我正在使用这个extension 来获取随机颜色:

extension UIColor {

    static var random: UIColor {
        return UIColor(red: .random(in: 0...1),
                       green: .random(in: 0...1),
                       blue: .random(in: 0...1),
                       alpha: 1.0)
    }
}

根据这个post,我们可以假设:

if (B > R) { 
    color = cool
} else { 
    color = warm
}

如何修改我的随机扩展以选择随机暖色或随机冷色。

有什么建议吗?

【问题讨论】:

    标签: ios swift uikit uicolor


    【解决方案1】:

    如果您首先生成数字,则可以在计算 red 时使用 blue 的值,如下所示...

    extension UIColor {
        static var warm: UIColor {
            let red: CGFloat = .random(in: 0...1)
            let blue: CGFloat = .random(in: 0..<red)
            return UIColor(red: red, green: .random(in: 0...1), blue: blue, alpha: 1)
        }
    
        static var cool: UIColor {
            let blue: CGFloat = .random(in: 0...1)
            let red: CGFloat = .random(in: 0..<blue)
            return UIColor(red: red, green: .random(in: 0...1), blue: blue, alpha: 1)
        }
    }
    

    这将满足您对冷是红小于蓝和暖是蓝小于红的要求。

    【讨论】:

    • 您的方法可以产生没有红色的暖色、没有蓝色的冷色,或者红色和蓝色分量太接近而无法看到差异的任何一种颜色。请参阅我的答案(向您的答案点头,因为它是一个轻微的变化),它迫使暖色具有显着的红色成分,冷色具有显着的蓝色成分,并且两者都具有较少的“其他”颜色。跨度>
    【解决方案2】:

    Fogmeister 的回答符合技术要求,但存在一些问题。对于暖色,如果红色足够低,您将看不到它。暖色中的蓝色分量可能与红色非常接近,以至于没有明显的差异,等等。

    我建议改为:

    extension UIColor {
        static var warm: UIColor {
            let red: CGFloat = .random(in: 0.6...1)  /Force red to be at least 0.6
            let blue: CGFloat = .random(in: 0..<0.5) //Force blue to be smaller
            return UIColor(red: red, green: .random(in: 0...1), blue: blue, alpha: 1)
        }
    
        static var cool: UIColor {
            let blue: CGFloat = .random(in: 0.6..<1.0)  //Force blue to be > 0.6
            let red: CGFloat = .random(in: 0...0.5) //Force red to be smaller
            return UIColor(red: red, green: .random(in: 0...1), blue: blue, alpha: 1)
        }
    }
    

    【讨论】: