2017-02-01 8 views
0

Я пытаюсь установить цвет фона сцены на случайный цвет при запуске, используя приведенный ниже код.Swift - установка случайного UIColor не работает

func randomColor() -> 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) 
} 

override func didMove(to view: SKView) { 
    self.backgroundColor = randomColor() 
    } 

Я использую код в другом месте в моей программе и его работе, как ожидается, однако, когда я пытаюсь установить цвет фона сцены с одной и той же функцией, которую он всегда загружает один и тот же зеленый цвет. Любая идея почему?

+0

Вместо этого используйте 'arc4random_uniform()'. Он выиграл «потребовать случайное семя и будет работать так, как вы ожидаете. – Desdenova

+0

Здесь: http://stackoverflow.com/questions/25050309/swift-random-float-between-0-and-1 – Desdenova

+0

@Mick bro вы можете заменить код на 'var red: CGFloat = arc4random()% 255/255.0 // Или (рекомендуется): var red: CGFloat = arc4random_uniform (255)/255.0' & let me know if work. –

ответ

0

Используйте нижеследующую функцию:

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

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

В комментарии Mukesh является правильным.

Причина:

Многие компьютерные цветовые палитры и устройство вывода Mac ожидать RGB цветовых компонент для представления в 8-битовых значениях, которые, будучи выражены в виде целых чисел, находящихся в диапазоне от 0 до 255.

1

«Стандартный» способ генерации случайного числа - arc4random_uniform, а не drand48, и я не знаю, где вы нашли такое.

Вместо того, чтобы генерировать случайное значение для каждого компонента, почему бы не просто сгенерировать один Int (между 0x0 и 0xffffff) и преобразовать его в цвет?

Во-первых, мы генерируем номер:

let randomNumber = Int32(arc4random_uniform(16777216)) 

Далее мы пишем расширение для UIColor, который преобразует это число в UIColor:

extension UIColor { 
    public static func convertToColor(number: Int32) -> UIColor { 
     return UIColor.init(red: CGFloat((hex>>16)&0xFF)/255.0, green: CGFloat((hex>>8)&0xFF)/255.0, blue: CGFloat(hex&0xFF)/255.0, alpha: 1.0) 
    } 
} 

Тогда мы можем вызвать этот метод:

let randomColor = UIColor.convertToColor(number: randomNumber)