问题
I have used two collection views which name is cltnEdits
and cltnTools
, i am Displaying cltnTools
by default. when user click on any item of cltnTools
then cltnEdits
collection view is appeared otherwise it will be hidden. there is one cancel button with cltnEdits
, whenever user click on that cancel button cltnEdits
is disappeared(Hidden) and cltnTools
is appeared.
My both Collection views are in UIStackView
I am getting following error while selecting element from collection view which name is cltnTools
.
I have Tried following code to resolve this error but its not works for me
cltnEdits.reloadData()
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.layoutSubviews()
cltnTools.reloadData()
cltnTools.collectionViewLayout.invalidateLayout()
cltnTools.layoutSubviews()
and also tried this
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
cltnEdits.collectionViewLayout.invalidateLayout()
}
and added this UICollectionViewDelegateFlowLayout
delegate
func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
following is my didSelect method for cltnTools
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
}
}
How can i resolve my error? someone please help!
NOTE: Before marking it duplicate please check my code that i have tried all solution given in other question asked on stack.
回答1:
Try to swap reloadData()
and invalidateLayout()
, and additionally do not call layoutSubviews
directly (see docs)
cltnEdits.collectionViewLayout.invalidateLayout()
cltnEdits.reloadData()
cltnEdits.setNeedsLayout()
cltnEdits.layoutIfNeeded()
cltnTools.collectionViewLayout.invalidateLayout()
cltnTools.reloadData()
cltnTools.setNeedsLayout()
cltnTools.layoutIfNeeded()
来源:https://stackoverflow.com/questions/46903770/uicollectionview-received-layout-attributes-for-a-cell-with-an-index-path-that-d