iOS 8 Swift UICollectionView reloadData() 导致视图(图像)跳单元格
iOS 8 Swift UICollectionView reloadData() causing views (images) to jump cells
我有一个 UICollectionView
的 20 个单元格,里面有一个 imageView
。当用户单击正确的单元格时,我会在该单元格中绘制另一个 imageView
(我们称之为 correctCircle)。这很好用。
但我在 UICollectionView
中也有一个 header,我会在其中提出他们需要回答的问题。每次点击(等待 2 秒)后,问题应该更新,我有一个更新 Header 文本标签的功能,这也可以正常工作。
我的问题是:
为了更新 Header 文本,我必须调用 uicollectionView.reloadData()
,每当我这样做时,我在单元格(correctCircle)中绘制的 UIImageView
就会移动到另一个单元格!
我已经尝试了所有我能想到的方法,包括该线程中的解决方案:
UICollectionView reloadData not functioning properly in iOS 7
但无法正常工作。任何想法都非常受欢迎。理想情况下,我只会刷新 header 而不是其余单元格,但似乎没有办法做到这一点。
编辑: 根据评论稍微修改代码,现在我在每个单元格中有 2 张图片,其中一张被隐藏,然后我显示它,而不是添加 imageView
点击后。
下面是一些相关代码:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as CollectionViewIconCell
// bigIcon() just returns the animal's icon image
cell.icon.image = animalsArray[indexPath.row].bigIcon()
return cell
}
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
// we cannot use a dequeueReusableCellWithReuseIdentifier, we need this
let cell = collectionView.cellForItemAtIndexPath(indexPath) as CollectionViewIconCell
if currentAnimal == self.correctAnimal {
cell.circleImage.image = correctCircleImage
cell.circleImage.hidden = false
correctAnswers++
// nextQuestion() simply loads the text that will go in the Header.label
self.nextQuestion()
self.collectionView!.reloadData()
} else {
self.answerCircle.image = UIImage(named: "wrongCircle")
self.answerCircle.sizeToFit()
cell.addSubview(answerCircle)
self.nextQuestion()
self.collectionView!.reloadData()
}
}
谢谢。
PS
阅读了一些评论,也许我在新问题上没有正确设置 header 的文本?我从教程中获得了所有这些代码,对 UICollectionView 非常陌生,所以请原谅我的无知,但是有没有更好的方法来刷新 header 文本?我无法在 viewForSupplementaryElementOfKind
函数之外获取 header。
我应该解释一下我有 2 个不同的图像视图,一个用于正确答案,一个用于错误答案,因为正确答案的圆圈应该保留,而错误答案的圆圈将在每个问题上删除并重新使用。
您的问题不在显示的代码中,而是在请求时 returns 单元格的代码中,特别是因为您没有通过设置两个图像视图的状态来完全更新它。因此,当单元格被重复使用时,它具有来自另一行的错误(旧)设置。
确实是数据模型和单元格设计问题。该单元格应始终有 2 个图像视图,您应该根据需要使其可见或隐藏,并且需要根据您在每次用户选择后更新的数据模型确定,然后重新加载(只要可以更新单元格而不是完全重新加载).
我有一个 UICollectionView
的 20 个单元格,里面有一个 imageView
。当用户单击正确的单元格时,我会在该单元格中绘制另一个 imageView
(我们称之为 correctCircle)。这很好用。
但我在 UICollectionView
中也有一个 header,我会在其中提出他们需要回答的问题。每次点击(等待 2 秒)后,问题应该更新,我有一个更新 Header 文本标签的功能,这也可以正常工作。
我的问题是:
为了更新 Header 文本,我必须调用 uicollectionView.reloadData()
,每当我这样做时,我在单元格(correctCircle)中绘制的 UIImageView
就会移动到另一个单元格!
我已经尝试了所有我能想到的方法,包括该线程中的解决方案: UICollectionView reloadData not functioning properly in iOS 7
但无法正常工作。任何想法都非常受欢迎。理想情况下,我只会刷新 header 而不是其余单元格,但似乎没有办法做到这一点。
编辑: 根据评论稍微修改代码,现在我在每个单元格中有 2 张图片,其中一张被隐藏,然后我显示它,而不是添加 imageView
点击后。
下面是一些相关代码:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as CollectionViewIconCell
// bigIcon() just returns the animal's icon image
cell.icon.image = animalsArray[indexPath.row].bigIcon()
return cell
}
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
// we cannot use a dequeueReusableCellWithReuseIdentifier, we need this
let cell = collectionView.cellForItemAtIndexPath(indexPath) as CollectionViewIconCell
if currentAnimal == self.correctAnimal {
cell.circleImage.image = correctCircleImage
cell.circleImage.hidden = false
correctAnswers++
// nextQuestion() simply loads the text that will go in the Header.label
self.nextQuestion()
self.collectionView!.reloadData()
} else {
self.answerCircle.image = UIImage(named: "wrongCircle")
self.answerCircle.sizeToFit()
cell.addSubview(answerCircle)
self.nextQuestion()
self.collectionView!.reloadData()
}
}
谢谢。
PS
阅读了一些评论,也许我在新问题上没有正确设置 header 的文本?我从教程中获得了所有这些代码,对 UICollectionView 非常陌生,所以请原谅我的无知,但是有没有更好的方法来刷新 header 文本?我无法在 viewForSupplementaryElementOfKind
函数之外获取 header。
我应该解释一下我有 2 个不同的图像视图,一个用于正确答案,一个用于错误答案,因为正确答案的圆圈应该保留,而错误答案的圆圈将在每个问题上删除并重新使用。
您的问题不在显示的代码中,而是在请求时 returns 单元格的代码中,特别是因为您没有通过设置两个图像视图的状态来完全更新它。因此,当单元格被重复使用时,它具有来自另一行的错误(旧)设置。
确实是数据模型和单元格设计问题。该单元格应始终有 2 个图像视图,您应该根据需要使其可见或隐藏,并且需要根据您在每次用户选择后更新的数据模型确定,然后重新加载(只要可以更新单元格而不是完全重新加载).