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

    }
}

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

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

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


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


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 .


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

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

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


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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.