有些 UIColors 是黑色的,而不是它们应该的样子,为什么?

Some UIColors are black instead of the way the way they should be, why?

我正在制作这个应用程序,假设我获得了 rgba 颜色的红色、绿色和蓝色的 CGFloat 值。我使用它们为 tableView 中的单元格赋予颜色。有些工作得很好,但有些是黑色的,而不是它们应该的颜色。它主要是深色,虽然我非常怀疑这与它有什么关系。我不知道为什么会这样。

代码如下:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = Bundle.main.loadNibNamed("CustomTableViewCell", owner: self, options: nil)?.first as! CustomTableViewCell
    cell.cellColor.backgroundColor = UIColor(red: CGFloat(myClasses[indexPath.row].red), green: CGFloat(myClasses[indexPath.row].green), blue: CGFloat(myClasses[indexPath.row].blue), alpha: 1.0)
    cell.cellLabel.text = myClasses[indexPath.row].name
    return cell
}

一些例子:

case "Light green":
        colorArray = [128/255, 1, 0]
    case "Dark green":
        colorArray = [76/255, 153/255, 0]
    case "Light blue":
        colorArray = [0, 1, 1]
    case "Dark blue":
        colorArray = [51/255, 51/255, 1]
    case "Purple":
        colorArray = [102/255, 0, 204/255]
    case "Yellow":
        colorArray = [1, 1, 0]

浅绿色、浅蓝色和黄色作品。深绿、深蓝、紫色不要。

76/255153/255102/255204/255是整数除法,都等于0

要解决这个问题只需通过添加 .0:

使分子或分母加倍

76/255.076.0/255.076.0/255.0

您应该确保所有其他颜色也是 真实 划分。

将两个 Int 相除会得到另一个 Int,而您需要一个 Double。将它们转换为 CGFloat,因为 UIColor 初始化程序无论如何都接受 CGFloat。同时将 colorArray 定义为 [CGFloat].

case "Light green":
    colorArray = [CGFloat(128)/CGFloat(255), 1, 0]
case "Dark green":
    colorArray = [CGFloat(76)/CGFloat(255), CGFloat(153)/CGFloat(255), 0]
case "Light blue":
    colorArray = [0, 1, 1]
case "Dark blue":
    colorArray = [CGFloat(51)/CGFloat(255), CGFloat(51)/CGFloat(255), 1]
case "Purple":
    colorArray = [CGFloat(102)/CGFloat(255), 0, CGFloat(204)/CGFloat(255)]
case "Yellow":
    colorArray = [1, 1, 0]

正如其他答案所暗示的那样,Swift 类型推断不知道那些数组应该具有类型 CGFloat。例如,如果您这样做了 let foo: CGFloat = 123/255 那么那将不是整数除法。但是这些数组组件的类型被推断仍然是Int。所以你变黑了,因为任何小于 1 的分区都将降为 0。

如果出于某种原因必须使用您在问题中定义的此设置,则可以使用元组而不是数组:

typealias ColorTuple = (red: CGFloat, green: CGFloat, blue: CGFloat)

// ...
var colorTuple: ColorTuple?
let myColor = "Light green" // for example

switch myColor {
case "Light green":
    colorTuple = (128/255, 1, 0)
case "Dark green":
    colorTuple = (76/255, 153/255, 0)
case "Light blue":
    colorTuple = (0, 1, 1)
case "Dark blue":
    colorTuple = (51/255, 51/255, 1)
case "Purple":
    colorTuple = (102/255, 0, 204/255)
case "Yellow":
    colorTuple = (1, 1, 0)
default:
    break
}

这具有比其他建议简洁得多的优点。如果你需要它是一个数组,你可以在之后创建一个合适的数组。

很难在不了解更多的情况下说出来,但您可能会发现在 UIColor 上使用带有名为 lightGreendarkGreen 等静态变量的扩展 return UIColor 使用 RGB 初始值设定项初始化的实例会比您在此处拥有的更好。