这个让我难过。
func updateCollectionView() {
DispatchQueue.main.async { [weak self] in
if let strongSelf = self {
let layout = UICollectionViewFlowLayout()
let minimumSpacing: CGFloat = 8
layout.minimumInteritemSpacing = minimumSpacing
layout.minimumLineSpacing = minimumSpacing
let dim = strongSelf.view.frame.width / CGFloat(strongSelf.size) - minimumSpacing
layout.itemSize = CGSize(width: dim, height: dim)
strongSelf.collectionView.setCollectionViewLayout(layout, animated: true)
strongSelf.collectionView.reloadData()
}
}
}
当它尝试setCollectionViewLayout时,我得到:
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x800000000)
collectionView,strongSelf和layout都是有效的对象。只有当strongSelf.size小于4时才会发生这种情况,如果这有帮助的话。
答案 0 :(得分:0)
嗯,这个对我来说很奇怪,但我用这位绅士的帖子解决了这个问题:
http://jaymayu.com/uicollectionview-and-dynamically-changing-layouts-on-runtime/
基本上,我必须这样做:
strongSelf.gridCollectionView.reloadData()
strongSelf.gridCollectionView.collectionViewLayout.invalidateLayout()
strongSelf.gridCollectionView.setCollectionViewLayout(layout, animated: false)
重要的是reloadData()需要在setCollectionViewLayout之前。我需要仔细考虑这是为什么,但这解决了这个问题。