集合视图行颜色在滚动上更改

时间:2018-05-06 18:39:29

标签: swift uicollectionview uicollectionviewcell

我有这个集合视图,并且在根据它的索引绘制每一行时,我已经设置了它的颜色。它会显示每行的正确颜色,直到您向下滚动然后再向上移动。例如,如果按照R,G,B,R,G,B的顺序上下滚动一点点,它可能是G,G,R,B,R,B。我已经尝试将rasterize图层设置为true和false,但也没有运气。我不知道为什么会发生这种情况以及如何解决这个问题。因为我在cellForItemAt函数上设置颜色,并且每当再次绘制一行并且将行颜色基于颜色列表和该行的id时,它应该被调用它应该总是绘制相同的东西。

这是我的代码的一部分。

class MyCollectionViewController: UICollectionViewController {
//MARK: Properties

var list = [Item]()
var colors = [[String]]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.refreshList(self)
    colors.append(["#ff3e99","#ffa35a"])
    colors.append(["#668dff","#ff53ff"])
    colors.append(["#6ae0d7","#00d3ad"])
}    

override func numberOfSections(in tableView: UICollectionView) -> Int {
    return 1
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return list.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "xxxx"

    guard let cell = self.collectionView?.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as? xxxxCell  else {
        fatalError("The dequeued cell is not an instance of xxxx.")
    }
    // Fetches the appropriate meal for the data source layout.
    let item = list[indexPath.row]
    style(cell: cell.rootView, index: item.id!)

    return cell
}

func style(cell:LGButton, index: Int) {
    cell.gradientStartColor = UIColor(hexString: colors[index % colors.count][0])
    cell.gradientEndColor = UIColor(hexString: colors[index % colors.count][1])
    cell.shadowColor = UIColor(hexString: colors[index % colors.count][0])
    cell.shadowRadius = 8
    cell.shadowOpacity = 0.8
}

}

2 个答案:

答案 0 :(得分:0)

滚动时的问题让我觉得它是一个细胞重用问题。尝试在自定义xxxxCell prepareForReuse中实施UICollectionViewCell。重置属性,看看是否有帮助。

类似的东西:

override func prepareForReuse() {
    super.prepareForReuse()
    gradientStartColor = UIColor.clear
    gradientEndColor = UIColor.clear
    shadowColor = UIColor.clear
}

答案 1 :(得分:0)

我还没有使用过LGButton,但是看https://github.com/loregr/LGButton/blob/develop/LGButton/Classes/LGButton.swift,假设这是你正在使用的代码,一旦设置了渐变,你就无法改变它。因此,当您的单元格被重用时,即使您尝试重置style函数中的渐变颜色,LGButton代码也不会遵循更改。

在上面的链接中,在第398行(截至本文撰写时),函数setupGradientBackground的第一行检查变量gradient是否为零,如果是,则设置{{1}这意味着当您更新渐变开始和结束颜色时,它将不会更改。我认为这是LGButton的一个缺陷 - 当你改变开始或结束颜色的值时,它应该重新计算渐变。

在我看来,您可以将渐变设置为nil以强制重新计算。您可能需要将所有值设置为nil,以便在设置完所有值之前不会重置渐变。

在下面的代码段中,我还将单元格参数重命名为gradient,因此对它的调用不会产生误导 - 看起来像是在传递单元格而不是按钮。

button