如何使用Swift制作随机颜色


78

如何使用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

    }
}

Answers:


191

您将需要一个函数来产生CGFloat0到1范围内的random :

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() -> CGFloat在外面是没有用的,static func random() -> UIColor因此您可以在第二个里面声明第一个方法
Vyachaslav Gerchicov

80

对于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

32

生成函数以生成随机颜色:

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的developer.apple.com/documentation/coregraphics/cgfloat
bungdito

28

对于随机纯色,可以使用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

在此处输入图片说明


1
检查您的屏幕截图:获得完美黄色(第二结果)的概率是多少?
心教堂

您可以使用整数微调赔率,并确定现在想要在色相范围内的许多步骤
Leo Dabus

我相信这种黄色的几率约为6000分之一:尚未对Int8进行四舍五入,因此您有1000次机会有1000次获得小于0.0005或大于0.9995的浮动。然后有6种可能的边(0 0 1,0 1 0,0 1 1,1 0 0,1 0 1,1 1 0)。
心教堂

1
我认为您是对的,我想出了6666中有1的几率来产生范围内的浮动0.16659 ... 0.16674
Leo Dabus

12

使用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(基于色相,饱和度和亮度进行实例化)[ developer.apple.com/documentation/uikit/uicolor/1621931-init]。黄色的色调将是绿色和红色的中点。红色为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

迅捷4.2🔸

我添加此答案是因为它使用了不同的方法,并且由于许多以前的答案都需要附加的语法糖,因此我认为不应将其作为首选。Vanilla 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

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


4

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

0
func anotherGetRandomColor()->UIColor{

    let newRed   = Double(arc4random_uniform(256))/255.0
    let newGreen = Double(arc4random_uniform(256))/255.0
    let newBlue  = Double(arc4random_uniform(256))/255.0

    return UIColor(red: CGFloat(newRed), green: CGFloat(newGreen), blue: CGFloat(newBlue), alpha: 1.0)
}

1
此代码的熵为255 * 255 * 255,可能很弱。更好地生成浮点值而不是小的整数。最重要的是,它arc4random_uniform(255)只会提供0到254之间的值,因此您偏向深色。
心教堂

1
@Cœur除了他的除法有缺陷之外,因为他在将值除以0 ...
254/255
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.