UICollectionView接收具有不存在的索引路径的单元格的布局属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionView接收具有不存在的索引路径的单元格的布局属性相关的知识,希望对你有一定的参考价值。
我使用了两个集合视图,名称是cltnEdits
和cltnTools
,我默认显示cltnTools
。当用户点击cltnTools
的任何项目时,会出现cltnEdits
集合视图,否则它将被隐藏。有一个取消按钮与cltnEdits
,每当用户点击取消按钮cltnEdits
消失(隐藏)和cltnTools
出现。
我的两个Collection视图都在UIStackView中
从集合视图中选择元素时,我收到以下错误,其名称为cltnTools
。
我尝试了以下代码来解决此错误,但它不适合我
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
cltnTools.reloadData()
cltnTools.collectionViewLayout.invalidateLayout()
cltnTools.layoutSubviews()
并试过这个
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
cltnEdits.collectionViewLayout.invalidateLayout()
}
并添加了这个UICollectionViewDelegateFlowLayout
代表
func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
以下是我对cltnTools的didSelect方法
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if collectionView == cltnTools {
selectedItem.push(item: "CltnTools")
switch indexPath.row {
case 0:
//Edits
arrImage = arrEditToolsImage
arrText = arrEditToolsText
selectedItem.push(item: arrMainToolsText[indexPath.row])
viewCrop.image = imgImage.image
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
case 1:
//Effect
selectedItem.push(item: arrMainToolsText[indexPath.row])
arrImage = arrEffectToolsImage
arrText = arrEffectToolsText
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
case 2:
//Colors
selectedItem.push(item: arrMainToolsText[indexPath.row])
arrImage = arrColorToolsImage
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
case 3:
//Text
selectedItem.push(item: arrMainToolsText[indexPath.row])
arrImage = arrTextToolsImage
arrText = arrTextToolsText
imgImage.addLabel()
//Modify the Label
imgImage.textColor = UIColor.black
imgImage.textAlpha = 1
imgImage.currentlyEditingLabel.closeView!.image = #imageLiteral(resourceName: "Delete")
imgImage.currentlyEditingLabel.rotateView?.image = #imageLiteral(resourceName: "Resize")
imgImage.currentlyEditingLabel.border?.strokeColor = UIColor.black.cgColor
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
case 4:
//Frame
selectedItem.push(item: arrMainToolsText[indexPath.row])
print("Frame (arrFrameToolsImage.count)")
arrImage = arrFrameToolsImage
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
case 5:
//Goodies
selectedItem.push(item: arrMainToolsText[indexPath.row])
arrImage = arrGoodiesToolsImage
print("Goodies (arrGoodiesToolsImage.count)")
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
toolsToEdits()
break
default:
break
}
}
我该如何解决我的错误?有人请帮忙!
注意:在将其标记为重复之前,请检查我的代码,我已经尝试了在堆栈上的其他问题中给出的所有解决方案。
答案
尝试交换reloadData()
和invalidateLayout()
,另外不要直接调用layoutSubviews
(参见docs)
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.reloadData()
cltnEdits.setNeedsLayout()
cltnEdits.layoutIfNeeded()
cltnTools.collectionViewLayout.invalidateLayout()
cltnTools.reloadData()
cltnTools.setNeedsLayout()
cltnTools.layoutIfNeeded()
以上是关于UICollectionView接收具有不存在的索引路径的单元格的布局属性的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 收到具有不存在索引路径的单元格的布局属性
具有单元格间距的 UICollectionView 存在滚动问题
具有网络数据的 UICollectionView 在与交互之前不显示单元格