Як зробити випадковий колір за допомогою Swift


81

Як я можу зробити функцію випадкового кольору за допомогою 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

    }
}

Відповіді:


196

Вам знадобиться функція для створення випадкових CGFloats в діапазоні від 0 до 1:

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

Якщо вам потрібна випадкова альфа, просто створіть ще одне випадкове число для цього.

Тепер ви можете призначити колір тла вигляду таким чином:

self.view.backgroundColor = .random()

1
static func random() -> CGFloatпоза даремно, static func random() -> UIColorтому ви можете оголосити перший метод всередині другого
Вячаслав Герчиков

81

Для 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

34

Створіть функцію для генерації випадкового кольору:

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
bungdito

28

Для випадкових суцільних кольорів ви можете використовувати ініціалізатор 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

введіть тут опис зображення


1
Перевірте знімок екрана: якою була ймовірність отримати ідеальний жовтий (другий результат)?
Cœur

Ви можете точно налаштувати шанси, використовуючи цілі числа і визначаючи зараз багато кроків, які ви хочете, в діапазоні відтінків
Лео Дабус,

Я вважаю, що шанси були приблизно 1 з 6000 для цього жовтого: не робиться жодного округлення до Int8, тому у вас був 1 шанс з 1000, щоб отримати поплавок менше 0,0005 або більше 0,9995. І тоді є 6 можливих ребер (0 0 1, 0 1 0, 0 1 1, 1 0 0, 1 0 1, 1 1 0).
Cœur

1
Я думаю, ви маєте рацію. Я придумав коефіцієнт 1 з 6666, щоб генерувати поплавок в діапазоні0.16659 ... 0.16674
Лео Дабус,

12

За допомогою 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)
  }
}

Детальніше тут .


Привіт. якщо я хочу навмання діапазон від червоного -> жовтого. Чи можете ви надати деякі пропозиції?
famfamfam

1
Чудове запитання @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)
leogdion

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

7

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


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

4

Свіфт 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)
    }
}

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
Ентропія цього коду становить 255 * 255 * 255, що може бути слабким. Краще генерувати плаваючі значення замість малих цілих чисел. На додаток до цього, ви arc4random_uniform(255)отримаєте лише значення від 0 до 254, тож ви схильні до темних кольорів.
Cœur,

1
@ Cœur, крім того, його поділ є недосконалим, оскільки він ініціалізував CGFloat після ділення значення в діапазоні 0 ...
254/255,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.