在STO和其他博客上查看完解决方案之后,似乎没有人真正解决其他人今天似乎仍然需要的UICollectionView问题!
避免重载功能最初加载CollectionVC没有问题,向下滚动到底部也没有问题,但是当我向上滚动时,随机单元格会丢失。另外,注意到我在滚动时多次调用下面的委托方法,这是正常的吗?
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
使用任何重载函数会导致随机单元格.backgroundView消失:
self.collectionView?.reloadSections(NSIndexSet.init(index: 0))
self.collectionView?.reloadData()
self.collectionView?.reloadItemsAtIndexPaths(cellIndexPathArray)
self.collectionView?.reloadInputViews()
使用不同的覆盖选项对UICollectionViewFlowLayout进行子类化似乎没有效果。
class CustomCollectionFlowLayout: UICollectionViewFlowLayout {
override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
//self.scrollDirection = UICollectionViewScrollDirection.Vertical
return true
//invalidateLayoutWithContext(invalidationContextForBoundsChange(newBounds))
//return super.shouldInvalidateLayoutForBoundsChange(newBounds)
}
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
/*
let attributes = super.layoutAttributesForElementsInRect(rect)
print(attributes)
let contentSize = collectionViewContentSize()
return attributes?.filter { $0.frame.maxX <= contentSize.width && $0.frame.maxY < contentSize.height }
*/
let attributes = super.layoutAttributesForElementsInRect(rect)
return attributes
}
}
CollectionVC.swift
private let reuseIdentifier = "cell"
class CollectionVC: UICollectionViewController {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
override func viewDidLoad() {
super.viewDidLoad()
//Register cell class
self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}
////////////////////////////////
//UICollectionViewDataSource
////////////////////////////////
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of items
return appDelegate.chosenImageArray.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
// Configure the cell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
cell.backgroundColor = UIColor.clearColor()
cell.layer.borderColor = UIColor.whiteColor().CGColor
cell.layer.borderWidth = 1
cell.layer.cornerRadius = 8
let bgView = appDelegate.chosenImageArray.objectAtIndex(indexPath.row) as? UIView
if bgView != nil {
cell.backgroundView = bgView
cell.hidden = false
cell.backgroundView?.hidden = false
}
return cell
}
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return appDelegate.deviceSize
//Tried with different sizes CGSize(100,100) - (200,200) and 0 on insets, no difference
}
////////////////////////////////
//UICollectionViewDelegate
////////////////////////////////
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
//do various stuff with selected cell and segue to next view, no issues here
}
}
希望有人可以告诉我它只需要输入一些设置,因为这个问题似乎是随机的,也许只是UICollectionView的一个错误?无论如何,非常感谢您提前寻求帮助。
答案 0 :(得分:0)
是的,每次滚动集合视图单元格时这都是正常的,并且再次在屏幕上显示委托被调用。 它正在重新使用。
在cellForItemAtIndexPath中你有
let bgView = appDelegate.chosenImageArray.objectAtIndex(indexPath.row) as? UIView
以上这一行。 我想在appDelegate.chosenImageArray你有所有的UIViews。
可能的修复 不要将UIView直接存储在数组上,创建一个NSObject模型类并在其中创建所需的属性。
- 尝试创建一个NSObject模型类,它应具有所有相关属性,如UIImage,name等......根据您的要求。 将NSObject类存储在数组中。这里NSObject类是您要存储在数组中的模型类。 现在在委托 cellForItemAtIndexPath - 让bgViewModel = appDelegate.yourModelClassArray.objectAtIndex(indexPath.row)为? yourModelClass
cell.backgroundView = bgViewModel.bgView
删除cell.hidden = false&amp; cell.backgroundView?.hidden = false它不是必需的。