iOS:如何在重用单元格开启时确保单元格保持其颜色

时间:2015-11-18 23:18:20

标签: ios uitableview

我正在构建一个应用程序,其中我的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用于跟踪数组中的索引。

我希望这是有道理的,如果需要进一步的细节,请询问。

1 个答案:

答案 0 :(得分:1)

由于您希望颜色均匀分布在表格的各行中,您可以对单元格的indexPath.row进行一些简单的数学运算来计算所需的颜色索引。

我不熟练使用Swift,所以下面的语法可能有点过时但应该很接近:

var colorIndex = Int((CGFloat(indexPath.row) / CGFloat(tasks.count)) * CGFloat(bgColors.count));

第一部分为您提供给定行的表格百分比,然后将该百分比应用于颜色计数。

请记住,如果行数不是颜色计数的整数倍,那么显然不是每种颜色都会出现相同的次数。