有些 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/255
、153/255
、102/255
和204/255
是整数除法,都等于0
。
要解决这个问题只需通过添加 .0
:
使分子或分母加倍
76/255.0
、76.0/255.0
或 76.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
上使用带有名为 lightGreen
、darkGreen
等静态变量的扩展 return UIColor
使用 RGB 初始值设定项初始化的实例会比您在此处拥有的更好。
我正在制作这个应用程序,假设我获得了 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/255
、153/255
、102/255
和204/255
是整数除法,都等于0
。
要解决这个问题只需通过添加 .0
:
76/255.0
、76.0/255.0
或 76.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
上使用带有名为 lightGreen
、darkGreen
等静态变量的扩展 return UIColor
使用 RGB 初始值设定项初始化的实例会比您在此处拥有的更好。