Ios 在UICollectionView中滚动和选择时的奇怪行为
我在UICollectionView中的自定义单元格上显示复选标记时遇到问题。在最初的几次点击中,一切正常,但当我开始滚动、反复点击或单击已选择的单元格时,行为会变得异常,如gif所示。也许我这样做是不对的?.addCheck()和.removeCheck()是我创建的自定义UICollectionViewCell类中的方法,它们所做的只是添加一个复选标记图像或从单元格视图中删除一个图像 下面是自定义单元格中的addCheck()和removeCheck()函数的外观Ios 在UICollectionView中滚动和选择时的奇怪行为,ios,swift,Ios,Swift,我在UICollectionView中的自定义单元格上显示复选标记时遇到问题。在最初的几次点击中,一切正常,但当我开始滚动、反复点击或单击已选择的单元格时,行为会变得异常,如gif所示。也许我这样做是不对的?.addCheck()和.removeCheck()是我创建的自定义UICollectionViewCell类中的方法,它们所做的只是添加一个复选标记图像或从单元格视图中删除一个图像 下面是自定义单元格中的addCheck()和removeCheck()函数的外观 func addCheck
func addCheck() {
// create check image
let checkImage = UIImage(named: "checkmark")
checkImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: bounds.size.height / 4, height: bounds.size.height / 4))
checkImageView.image = checkImage!.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
checkImageView.tintColor = UIColor.white()
// add the views
addSubview(checkImageView)
}
func removeCheck() {
if checkImageView != nil {
checkImageView.removeFromSuperview()
}
}
首先,您可以简化您的DID选择一点:
override func collectionView(collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// set colors to false for selection
for (index, color) in colorList.enumerate() {
if index == indexPath.row {
color.selected = false
settings.backgroundColor = color.color
}
else {
color.selected = false
}
}
collectionView.reloadData()
}
根据cellForItemAt方法中的语言,我猜当您在同一单元格上点击两次时,您正在添加第二个复选标记图像,并且没有正确跟踪该图像,因此单元格会随着collectionView的重新加载而不断旋转
发布您的cell类,或者至少是addCheck和removeCheck的逻辑,我们可能会发现问题
我建议在单元格上永久设置一个带有复选标记的imageView,根据选择简单地显示/隐藏它。这也会加快collectionView的速度。我在使用复选标记时遇到了类似的
UITableView问题。尝试创建元组数组来存储行和节值。谢谢你看。我在我的问题中添加了addCheck()和removeCheck()函数。我尝试了在每个单元格初始化时覆盖一个复选标记的方法,然后隐藏图像而不是删除图像,看起来效果不错。非常感谢你!伟大的看起来你最终会看到多个图像四处浮动
override func collectionView(collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// set colors to false for selection
for (index, color) in colorList.enumerate() {
if index == indexPath.row {
color.selected = false
settings.backgroundColor = color.color
}
else {
color.selected = false
}
}
collectionView.reloadData()
}