iOS Swift CollectionView如何在索引上设置正确的背景颜色

时间:2019-01-29 05:48:44

标签: ios swift uicollectionview uicollectionviewcell

这是我第一次使用CollectionView。我有一个简单的按钮,该按钮重复了9次,因为我用字符串数组填充了它。我想更改第一个元素的背景色,但是我可以做到这一点,但是在Scroll上,我也得到了具有相同背景色的其他元素,我只希望第一个元素具有该背景色。这是我的代码

class HomeC: UIViewController,CollectionViewDelegate,UICollectionViewDataSource {
    @IBOutlet weak var CategoriesView: UICollectionView!
    var CategoryIndex = 0

    var categoryTypes = ["All","General","Sports","Local Issues","Questions","Politics","Events","Advertise","Sell","Services"]

    override func viewDidLoad() {
        super.viewDidLoad()
        CategoriesView.delegate = self
        CategoriesView.dataSource = self
    }

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


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
        cell.items.tag = indexPath.row
        cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)

        if categoryTypes[indexPath.row] == "All" && indexPath.row == CategoryIndex {

            cell.items.backgroundColor = UIColor(hexString: BlueBackground)
            cell.items.setTitleColor(.white, for: .normal)
        } 
        return cell
    }
}

使用该代码,我的第一个元素“ All”具有适当的背景,但是如果我在collectionView上滑动,则其他元素也将具有蓝色背景。如何解决此问题?任何建议都很好。

3 个答案:

答案 0 :(得分:3)

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
        cell.items.tag = indexPath.row
        cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)

        if categoryTypes[indexPath.row] == "All" && indexPath.row == CategoryIndex {

            cell.items.backgroundColor = UIColor(hexString: BlueBackground)
            cell.items.setTitleColor(.white, for: .normal)
        } else {
            // set your normal cell color here
            cell.items.backgroundColor = UIColor(hexString: NormalCellColor)
            cell.items.setTitleColor(.normalTitleColoe, for: .normal)
     }
        return cell
}

由于收集视图使用出队的单元格,因此它将使用旧的单元格背景。那是蓝色的。如果您在else块中还原单元格颜色,将解决您的问题

如果您想以更专业的方式做。在单元格prepareForReuse上进行清理。

override open func prepareForReuse() {
    super.prepareForReuse()
    // Set your default background color, title color etc
}

答案 1 :(得分:1)

由于单元已被重用,因此需要提供默认值。最好的方法是在prepareForReuse类下覆盖CategoriesCVC方法。

override open func prepareForReuse() {
    super.prepareForReuse()
    cell.items.backgroundColor = UIColor.black //Any default BG color you are using when not selected
    cell.items.setTitleColor(.red, for: .normal) //Any default Title color you are using when not selected
}

答案 2 :(得分:0)

这里不需要同时匹配 cellForItemAt 中的两个条件,其中任意一个就足够了。如果阵列按顺序固定,则只需写 indexPath.row == 0 ;如果阵列的按钮标题名称固定,则需要匹配 categoryTypes[indexPath.row] == "All" 这个单一条件。参见下面的代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoriesCVC", for: indexPath) as! CategoriesCVC
        cell.items.tag = indexPath.row
        cell.items.setTitle(categoryTypes[indexPath.row], for: .normal)

        if indexPath.row == 0 {
            cell.items.backgroundColor = UIColor(hexString: BlueBackground)
            cell.items.setTitleColor(.white, for: .normal)
        } else {
            cell.items.backgroundColor = UIColor(hexString: DefaultCellColor)
            cell.items.setTitleColor(.defaultTitleColor, for: .normal)
     }
     return cell
}