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

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


    【解决方案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()
    

    【讨论】:

    【解决方案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

              【讨论】:

                猜你喜欢
                • 2019-03-29
                • 2021-02-05
                • 2015-11-07
                • 2019-10-29
                • 2014-09-08
                • 1970-01-01
                • 2022-12-06
                • 1970-01-01
                • 2018-08-26
                相关资源
                最近更新 更多