如何使用Swift生成随机颜色

112

如何使用Swift编写随机颜色函数?

import UIKit

class ViewController: UIViewController {

    var randomNumber = arc4random_uniform(20)
    var randomColor = arc4random()

    //Color Background randomly
    func colorBackground() {

        // TODO: set a random color
        view.backgroundColor = UIColor.yellow

    }
}
13个回答

221

您需要一个函数来生成0到1范围内的随机CGFloat

extension CGFloat {
    static func random() -> CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

然后您可以使用此功能创建随机颜色:

extension UIColor {
    static func random() -> UIColor {
        return UIColor(
           red:   .random(),
           green: .random(),
           blue:  .random(),
           alpha: 1.0
        )
    }
}
如果你想要一个随机的字母,只需要再创建一个随机数即可。
现在你可以像这样为你的视图分配背景颜色:
self.view.backgroundColor = .random()

1
static func random() -> CGFloatstatic func random() -> UIColor 之外是无用的,因此您可以在第二个方法中声明第一个方法。 - Vyachaslav Gerchicov
1
在最近的 Swift 版本中,大多数(或全部?)标量类型都有一个 random(in:) 函数,用于返回随机值。对于 CGFloat 类型,该函数为 static func random(in range: ClosedRange<CGFloat>) -> CGFloat。因此,您可以只使用 .random(in: 0...1),无需编写您自己的 random() 函数。 - Duncan C

126

对于Swift 4.2版本

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

针对Swift 3及以上版本:

extension CGFloat {
    static var random: CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

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

使用方法:

let myColor: UIColor = .random

37

创建一个函数来生成随机颜色:

func getRandomColor() -> UIColor {
     //Generate between 0 to 1
     let red:CGFloat = CGFloat(drand48())   
     let green:CGFloat = CGFloat(drand48()) 
     let blue:CGFloat = CGFloat(drand48())  

     return UIColor(red:red, green: green, blue: blue, alpha: 1.0)
}

现在,您可以在需要随机颜色时调用此函数。

self.view.backgroundColor = getRandomColor()

如果有人想了解更多关于CGFLoat的内容,请访问https://developer.apple.com/documentation/coregraphics/cgfloat。 - bungdito

35

对于随机的实心颜色,您可以使用UIColor HSB初始化程序,并仅随机化色相:

extension UIColor {
    static var random: UIColor {
        return .init(hue: .random(in: 0...1), saturation: 1, brightness: 1, alpha: 1)
    }
}

let color1: UIColor = .random
let color2: UIColor = .random
let color3: UIColor = .random
let color4: UIColor = .random
let color5: UIColor = .random

enter image description here


1
请检查你的屏幕截图:得到完美的黄色(第二个结果)的概率是多少? - Cœur
您可以使用整数微调概率,并确定您想要在色调范围中有多少步骤。 - Leo Dabus
我相信这个黄色的概率大约是6000分之1:没有进行Int8舍入,所以你有1000分之1的机会得到一个小于0.0005或大于0.9995的浮点数。然后有6个可能的边缘(0 0 1、0 1 0、0 1 1、1 0 0、1 0 1、1 1 0)。 - Cœur
1
我认为你是正确的,我得出了生成范围在0.16659 ... 0.16674之间的浮点数的概率是1/6666。 - Leo Dabus

28

SwiftUI - Swift 5

import SwiftUI

extension Color {
    static var random: Color {
        return Color(red: .random(in: 0...1),
                     green: .random(in: 0...1),
                     blue: .random(in: 0...1))
    }
}

用法:

let randomColor: Color = .random


14

使用 Swift 4.2,你可以通过使用新添加的随机函数来简化此过程:

extension UIColor {
  static func random () -> UIColor {
    return UIColor(
      red: CGFloat.random(in: 0...1),
      green: CGFloat.random(in: 0...1),
      blue: CGFloat.random(in: 0...1),
      alpha: 1.0)
  }
}

这里有更多细节,点击这里查看。


嗨,如果我想在红色->黄色范围内随机,你能提供一些建议吗? - famfamfam
1
很好的问题@famfamfam 然后我会根据色相、饱和度和亮度实例化。黄色的色相将是绿色和红色的中点。红色为0,绿色为1/3。因此黄色将是1/6。所以假设您想要一个恒定的饱和度和亮度,并且橙色是您的中点,那么我会这样做: UIColor(hue: CGFloat.random(in: 0...1.0/6.0), saturation: 1.0, brightness: 1.0, alpha: 1.0) 如果您想要绿松石作为中点,则您的色相将是: CGFloat.random(in: 1.0/6.0...1.0) - leogdion

12

Swift 4.2

我添加了这个答案,因为它使用了不同的方法,并且因为许多以前的答案需要额外的语法糖,在我看来不应该是首选。纯正的 Swift 胜出。

extension UIColor {
    /**
     * Returns random color
     * ## Examples: 
     * self.backgroundColor = UIColor.random
     */
    static var random: UIColor {
        let r:CGFloat  = .random(in: 0...1)
        let g:CGFloat  = .random(in: 0...1)
        let b:CGFloat  = .random(in: 0...1)
        return UIColor(red: r, green: g, blue: b, alpha: 1)
    }
}

5

Swift 4.2 扩展

extension UIColor {

    convenience init(red: Int, green: Int, blue: Int) {
        assert(red >= 0 && red <= 255, "Invalid red component")
        assert(green >= 0 && green <= 255, "Invalid green component")
        assert(blue >= 0 && blue <= 255, "Invalid blue component")

        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0)
    }

    convenience init(rgb: Int) {
        self.init(
            red: (rgb >> 16) & 0xFF,
            green: (rgb >> 8) & 0xFF,
            blue: rgb & 0xFF
        )
    }

    static func random() -> UIColor {
        return UIColor(rgb: Int(CGFloat(arc4random()) / CGFloat(UINT32_MAX) * 0xFFFFFF))
    }

}

用法:

let color = UIColor.random()

5

Swift 5.1

使这个函数生成随机颜色。

例如:view.backgroundColor = random()

func random() -> UIColor {
        return UIColor(red: .random(in: 0...1),
                       green: .random(in: 0...1),
                       blue: .random(in: 0...1),
                       alpha: 1.0)
    }

1
使用内联函数的扩展来生成随机数。
extension UIColor {
    static func random() -> UIColor {

        func random() -> CGFloat { return .random(in:0...1) }

        return UIColor(red:   random(),
                       green: random(),
                       blue:  random(),
                       alpha: 1.0)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接