如何使用 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 范围内的随机 CGFloat
s:
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() -> CGFloat
在static 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 的背景颜色清晰