如何使用 Swift 制作随机颜色

Posted

技术标签:

【中文标题】如何使用 Swift 制作随机颜色【英文标题】:How to make a random color with Swift 【发布时间】:2015-06-29 00:32:41 【问题描述】:

函数?

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

    

【问题讨论】:

【参考方案1】:

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

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
        )
    

如果你想要一个随机的 alpha,也可以为它创建另一个随机数。

您现在可以像这样分配视图的背景颜色:

self.view.backgroundColor = .random()

【讨论】:

static func random() -> CGFloatstatic func random() -> UIColor 之外是无用的,所以你可以在第二个方法中声明第一个方法【参考方案2】:

制作一个生成随机颜色的函数:

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【参考方案3】:

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

【讨论】:

【参考方案4】:

使用 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)
  

还有更多详情here。

【讨论】:

嗨。如果我想在红色范围内随机 - > 黄色。你能提供一些建议吗? 好问题@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)【参考方案5】:
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)

【讨论】:

这段代码的熵是255*255*255,可能比较弱。更好地生成浮点值而不是小整数。最重要的是,arc4random_uniform(255) 只会给出 0 到 254 之间的值,所以你偏向于更深的颜色。 @Cœur 除了他的除法有缺陷,因为他在除以 0...254 / 255 范围内的值后初始化 CGFloat,这将导致所有结果为零【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

使用带有内联函数的扩展来生成随机数

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)
    

【讨论】:

【参考方案9】:

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

【讨论】:

检查您的屏幕截图:获得完美黄色(第二个结果)的概率是多少? 您可以使用整数微调赔率,并在色调范围内确定您想要的步数 我相信这个黄色的几率大约是 6000 分之一:没有对 Int8 进行任何舍入,所以你有 1000 的机会得到一个小于 0.0005 或大于0.9995。然后有 6 个可能的边 (0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 1 1 0)。 我认为你是对的我想出了 6666 中的 1 的几率来生成范围内的浮点数 0.16659 ... 0.16674【参考方案10】:

斯威夫特 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)
    

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于如何使用 Swift 制作随机颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中制作简单的 UITabBarController?

在随机颜色数组中替换属性 CGColorGetComponents(在 swift 4 中不可用)

如何使用 .join 和 for 循环制作随机十六进制代码生成器?

Swift 5 CarbonKit pod 如何设置 x 轴并使 Pager 的背景颜色清晰

如何在swift 3的表格视图中仅更改选定行和未选定行的字体颜色和大小?

在swift 2中改变球类型的颜色