我正在构建一个应用程序,其中我的tableview单元格颜色从红色变为深蓝色(从热到冷),这决定了要完成任务的优先顺序。
在我的cellForRowAtIndexPath
方法中,我编写了一些逻辑来确保每个单元格的颜色相等,具体取决于任务集合的大小。我面临的问题是,每次生成新单元格时,跟踪当前索引的全局变量都会发生变化,这意味着我的单元格在某个给定点上都会变成一个块颜色(当用户滚动时)。
这是我目前的全球代码:
// Difference is calculated by dividing the bgColors size by the task collection size
var currDiff = 0
var currIndex = 0
var tasks = [PFObject]()
var bgColors = [
UIColor(red: 255, green: 51, blue: 51),
UIColor(red: 255, green: 153, blue: 51),
UIColor(red: 255, green: 255, blue: 51),
UIColor(red: 153, green: 255, blue: 51),
UIColor(red: 102, green: 255, blue: 51),
UIColor(red: 51, green: 255, blue: 204),
UIColor(red: 51, green: 204, blue: 255),
UIColor(red: 51, green: 102, blue: 255),
]
然后,这里是来自cellForRowAtIndexPath
的部分,它根据集合大小设置颜色:
// Compute the cell colour
let totalCells = tasks.count
let totalColors = bgColors.count
// If we exceed the number of colours, then evenly distribute them
if(totalCells > totalColors) {
let diff = Int(ceil(CGFloat(totalCells) / CGFloat(totalColors)))
if(currDiff > diff) {
currDiff = 0
currIndex++
}
if currIndex < 0 {
currIndex = 0
}
if(currIndex >= bgColors.count) {
currIndex = 0
}
cell.backgroundColor = bgColors[currIndex]
currDiff++
} else {
cell.backgroundColor = bgColors[indexPath.row]
}
在我在集合中有28个任务和8种颜色的场景中,此代码将计算28/8 = 3.5然后将其四舍五入为4,然后通过使用currDiff跟踪单元格数量来渲染4个块以特定颜色渲染,currIndex用于跟踪数组中的索引。
我希望这是有道理的,如果需要进一步的细节,请询问。
答案 0 :(得分:1)
由于您希望颜色均匀分布在表格的各行中,您可以对单元格的indexPath.row
进行一些简单的数学运算来计算所需的颜色索引。
我不熟练使用Swift,所以下面的语法可能有点过时但应该很接近:
var colorIndex = Int((CGFloat(indexPath.row) / CGFloat(tasks.count)) * CGFloat(bgColors.count));
第一部分为您提供给定行的表格百分比,然后将该百分比应用于颜色计数。
请记住,如果行数不是颜色计数的整数倍,那么显然不是每种颜色都会出现相同的次数。