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

CGFloat0에서 1 사이의 임의 의 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
        )
    }
}

임의의 알파를 원하면 다른 난수도 만드십시오.

이제 다음과 같이 뷰의 배경색을 지정할 수 있습니다.

self.view.backgroundColor = .random()

1
static func random() -> CGFloat쓸모 밖에있는 static func random() -> UIColor두 번째 하나의 제 1 내측 방법 선언 할 수 있도록
Vyachaslav Gerchicov

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

이제 많은 단계를 정수를 사용하여 결정하는 확률은 당신이 색조 범위에서 원하는 미세 조정 할 수 있습니다
레오 버스들이시길

이 노란색에 대한 배당률은 6000 점 중 1 점이라고 생각합니다. Int8에 대한 반올림이 수행되지 않았으므로 1000 번의 기회로 0.0005보다 작거나 0.9995보다 큰 부동 소수점을 얻을 수 있습니다. 그리고 가능한 6 개의 모서리가 있습니다 (01 1, 0 1 0, 012 1, 10 0, 10 1, 1 1 0).
Cœur

1
나는 당신이 옳다고 생각한다. 나는 6666 중 1의 배당률을 생각해 내서 범위 내에 부동을 생성한다0.16659 ... 0.16674
Leo Dabus dec

12

함께 스위프트 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 19

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는 모든 결과를 0으로 만드는 0 ... 254/255 범위의 값을 나눈 후 CGFloat를 초기화했기 때문에 그의 부서에 결함이 있다는 것 외에는
Leo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.