【问题标题】:How to compare a random UIColor to colors in an array of colors in swift?如何快速将随机 UIColor 与颜色数组中的颜色进行比较?
【发布时间】:2017-07-09 15:03:01
【问题描述】:

我有一个表格视图,每次我创建一个新行时,都会随机创建一个不同的颜色来改变它的背景。使用此功能:

func getRandomColor() -> UIColor{
    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)
} 

我将颜色存储在一个数组中,这样做我想避免在我的表格视图中使用等于颜色。 在表格视图 cellForRow 中创建表格视图时填充数组,如下所示:

colors.append(category.color as! UIColor)

类别是我的对象。

问题是当我关闭应用程序并再次启动它时。记忆继续并开始随机创建相同的颜色。所以我试图比较颜色以不断生成颜色,直到它是一种新颜色。使用此功能:

 func validateColor(color: UIColor) -> Bool {

    let primeiraCor = colors.first! as UIColor

    if primeiraCor == color {
        return false
    } else {
        return true
    }
} 

colors 是我的颜色数组,颜色是我要比较的颜色。但每次调用该函数时,它都会返回 true。

我能做什么?

【问题讨论】:

  • 您总是在与颜色数组的第一个元素进行比较 - 您需要遍历所有颜色以查看是否有重复。
  • 所以你有一个包含 10 个 UIColor 元素的 [Colors],当你创建一个随机颜色时,你需要检查随机生成的颜色数组是否与原始颜色数组具有相同的元素,如果它具有相同您需要省略该数组元素并创建一个新元素

标签: arrays swift object compare uicolor


【解决方案1】:

它可以更容易地完成:

func validateColor(color: UIColor) -> Bool {
    return !colors.contains(color)
}

或者,如果您想为平等添加一些阈值,那么您可以执行以下操作: 扩展名取自Extract RGB Values From UIColor

extension UIColor {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
        var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
        return getRed(&r, green: &g, blue: &b, alpha: &a) ? (r,g,b,a) : nil
    }
}


func validateColor(color: UIColor) -> Bool {
    let maxDistance: CGFloat = 0.3
    guard let colorComponents = color.components else {
        return true
    }
    return !colors.contains { c in
        guard let components = c.components else {
            return false
        }

        let distance = abs(colorComponents.red - components.red) + abs(colorComponents.green - components.green) + abs(colorComponents.blue - components.blue)

        return distance < maxDistance
    }
}

maxDistance 变量中设置阈值或将其移至类的静态成员以提高可读性。

【讨论】:

  • 包含不起作用。我已经试过了。但是谢谢,当我有时间时,我会测试另一种方式。谢谢。
【解决方案2】:

首先,每次运行时您总是会得到相同的颜色,因为 drand48() 生成相同的数字序列,除非您播种它。请参阅this answer 了解如何执行此操作,但这里是代码,使用当前时间随机化种子:

let time = UInt32(NSDate().timeIntervalSinceReferenceDate)
srand48(Int(time))
let number = drand48()

其次 - 您正在比较一个完全随机的颜色(实际上是一个介于 0 和近 17,000,000 之间的数字)并想知道为什么它似乎永远不会与您的颜色数组中的第一种颜色匹配?我认为如果它匹配,您应该会感到惊讶:-)

【讨论】:

  • 即使知道某天颜色会重复,这也解决了我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2013-07-31
  • 2018-09-27
相关资源
最近更新 更多