I "https://www.raywenderlich.com/392-uicollectionview-custom-layout-tutorial-pinterest" To create a Custom UICollectionView. (To adjust cell height)
If I scroll up, the cell will continue to be added, and scroll from top to bottom to refresh.
There is no problem when you run your app and initially grow Cells. However, there is always an error when refreshing or reordering the number of cells.
ERROR :
*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit-3698.93.8/UICollectionViewData.m:447
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist :
Therefore, "iOS 10 bug: UICollectionView received layout attributes for a cell with an index path that does not exist" And tried to solve the error.
on the line below
self.artCollectionView.reloadData ()
I tried adding
self.artCollectionView.collectionViewLayout.invalidateLayout ()
but it was not resolved.
Also, I do not know where to run
cache.removeAll ()
in the prepare () section. (There is a prepare () function in PinterestLayout.swift)
What is the correct way to resolve the error?
There is prepare
function in PinterestLayout.swift
as it should be because it is the only layout used for customizing the collectionView
.
At line 76, in PinterestLayout.swift file.
Try
override public func prepare() {
cache.removeAll()
if cache.isEmpty {
.....
}
}
extension UICollectionView{
func refreshLayout() {
let oldLayout = collectionViewLayout as! UICollectionViewFlowLayout
let newLayout = UICollectionViewFlowLayout()
newLayout.estimatedItemSize = oldLayout.estimatedItemSize
newLayout.footerReferenceSize = oldLayout.footerReferenceSize
newLayout.headerReferenceSize = oldLayout.headerReferenceSize
newLayout.itemSize = oldLayout.itemSize
newLayout.minimumInteritemSpacing = oldLayout.minimumInteritemSpacing
newLayout.minimumLineSpacing = oldLayout.minimumLineSpacing
newLayout.scrollDirection = oldLayout.scrollDirection
newLayout.sectionFootersPinToVisibleBounds = oldLayout.sectionFootersPinToVisibleBounds
newLayout.sectionHeadersPinToVisibleBounds = oldLayout.sectionHeadersPinToVisibleBounds
newLayout.sectionInset = oldLayout.sectionInset
newLayout.sectionInsetReference = oldLayout.sectionInsetReference
collectionViewLayout = newLayout
}
}
Then call:
YourCollectionView.refreshLayout()
YourCollectionView.reloadData()
Happy Coding!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With