如何用 Swift 制作随机颜色

问题描述 投票:0回答:13

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

    }
}
swift random colors uicolor func
13个回答
220
投票

您将需要一个函数来生成 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
        )
    }
}

如果您想要一个随机 alpha,只需为其创建另一个随机数即可。

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

self.view.backgroundColor = .random()

125
投票

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

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


25
投票

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

有更多详细信息这里


12
投票

斯威夫特 4.2 🔸

我添加这个答案是因为它使用了不同的方法,并且因为之前的许多答案需要额外的语法糖,在我看来,这不应该是首选。香草斯威夫特获胜。

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
投票

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

1
投票

Swift 5.8.1 扩展

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

用法

let randomColor = UIColor.random
print(randomColor)

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

0
投票

✅ 坚持随机颜色

当您知道颜色是由数字组成时,很容易生成随机颜色。因此只需传入从

0.0
1.0
的随机值即可。但很多时候您实际上想保留随机颜色而不实际存储它。

以下是如何根据种子(例如

userID
)生成始终相同的随机颜色:

/// - Note: Make it `Color` for SwiftUI
extension UIColor {
    static func random(seed: Int) -> Self {
        var generator = RandomNumberGenerator(seed: seed)

        return .init(
            red: .random(in: (0...1), using: &generator),
            green: .random(in: (0...1), using: &generator),
            blue: .random(in: (0...1), using: &generator)
            , alpha: 1 // Remove this line for the `SwiftUI.Color`
        )
    }
}

这是背后的随机数生成器:

struct RandomNumberGenerator: Swift.RandomNumberGenerator {
    init(seed: Int) { srand48(seed) }
    func next() -> UInt64 { UInt64(drand48() * Double(UInt64.max)) }
}
SwiftUI 示例:

以下内容始终相同,并且每次运行(也不每次预览)都不会更改。

SwiftUI sample 请注意,您可以按照您的需求来使用随机生成器

© www.soinside.com 2019 - 2024. All rights reserved.