Wie man mit Swift eine zufällige Farbe macht

78

Wie kann ich mit Swift eine zufällige Farbfunktion erstellen?

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

    }
}
Giovanie Rodz
quelle

Antworten:

191

Sie benötigen eine Funktion, um zufällige CGFloats im Bereich von 0 bis 1 zu erzeugen :

extension CGFloat {
    static func random() -> CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

Dann können Sie dies verwenden, um eine zufällige Farbe zu erstellen:

extension UIColor {
    static func random() -> UIColor {
        return UIColor(
           red:   .random(),
           green: .random(),
           blue:  .random(),
           alpha: 1.0
        )
    }
}

Wenn Sie ein zufälliges Alpha möchten, erstellen Sie auch dafür eine andere Zufallszahl.

Sie können jetzt die Hintergrundfarbe Ihrer Ansicht folgendermaßen zuweisen:

self.view.backgroundColor = .random()
ABakerSmith
quelle
1
static func random() -> CGFloatist außerhalb von nutzlos, static func random() -> UIColorso dass Sie die erste Methode innerhalb der zweiten deklarieren können
Vyachaslav Gerchicov
80

Für 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)
    }
}

Für Swift 3 und höher:

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

Verwendung:

let myColor: UIColor = .random
Orkhan Alikhanov
quelle
32

Erstellen Sie eine Funktion, um zufällige Farben zu generieren:

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

Jetzt können Sie diese Funktion aufrufen, wenn Sie eine zufällige Farbe benötigen.

self.view.backgroundColor = getRandomColor()
Bhavin Ramani
quelle
hier, wenn jemand mehr über CGFLoat developer.apple.com/documentation/coregraphics/cgfloat
bungdito
28

Für zufällige Volltonfarben können Sie den UIColor HSB-Initialisierer verwenden und nur den Farbton zufällig auswählen:

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

Geben Sie hier die Bildbeschreibung ein

Leo Dabus
quelle
1
Überprüfen Sie Ihren Screenshot: Wie hoch war die Wahrscheinlichkeit, dass Sie Ihr perfektes Gelb erhalten (zweites Ergebnis)?
Cœur
Sie können die Gewinnchancen mithilfe von Ganzzahlen fein
einstellen
Ich glaube, die Chancen für dieses Gelb lagen bei 1 von 6000: Es wird keine Rundung auf Int8 durchgeführt, sodass Sie 1 Chance von 1000 hatten, einen Float kleiner als 0,0005 oder größer als 0,9995 zu erhalten. Und dann gibt es 6 mögliche Kanten (0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 1 1 0).
Cœur
1
Ich denke, Sie haben Recht. Ich habe mir die Chance von 1 von 6666 0.16659 ... 0.16674
ausgedacht
12

Mit Swift 4.2 können Sie dies vereinfachen, indem Sie die neuen Zufallsfunktionen verwenden, die hinzugefügt wurden:

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

Weitere Details finden Sie hier .

Leogdion
quelle
Hallo. wenn ich zufällig im Bereich von rot -> gelb will. Können Sie einige Vorschläge machen?
Famfamfam
1
Tolle Frage @famfamfam Ich würde dann (basierend auf Farbton, Sättigung und Helligkeit instanziieren) [ developer.apple.com/documentation/uikit/uicolor/1621931-init] . Der Farbton für Gelb wäre der Mittelpunkt von Grün und Rot. Rot ist 0 und Grün ist 1/3. Daher wäre Gelb 1/6. Nehmen wir also an, Sie möchten eine konstante Sättigung und Helligkeit und Orange als Mittelpunkt, dann würde ich 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)
Folgendes
12

Swift 4.2 🔸

Ich füge diese Antwort hinzu, weil sie einen anderen Ansatz verwendet und weil viele der vorherigen Antworten zusätzlichen syntaktischen Zucker erfordern, der meiner Meinung nach nicht bevorzugt werden sollte. Vanilla Swift für den Sieg.

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)
    }
}
Eonist
quelle
5

Swift 4.2- Erweiterung

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

}

Verwendung:

let color = UIColor.random()
TimBigDev
quelle
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))
    }
}

Verwendung:

let randomColor: Color = .random

Xeaza
quelle
4

Swift 5.1

Machen Sie diese Funktion und generieren Sie zufällige Farben.

z.B 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)
    }
Raksha.
quelle
1

Verwenden einer Erweiterung mit einer Inline-Funktion zum Generieren von Zufällen

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)
    }
}
Alex Chase
quelle
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)
}
Bungdito
quelle
1
Die Entropie dieses Codes beträgt 255 * 255 * 255, was schwach sein kann. Generieren Sie besser Gleitkommawerte anstelle kleiner Ganzzahlen. Darüber hinaus arc4random_uniform(255)werden nur Werte von 0 bis 254 angegeben, sodass Sie zu dunkleren Farben tendieren.
Cœur
1
@ Cœur außerdem ist seine Division fehlerhaft, weil er CGFloat initialisiert hat, nachdem er einen Wert im Bereich 0 ... 254/255 geteilt hat, der alle Ergebnisse auf Null bringen würde
Leo Dabus