我有一个带有可扩展uicollectionviewcell的uicollectionview。 在iPhone上,每一行都有1列,这没有问题。 但是在iPad上,行有2列,展开单元格后会有问题。
这是单元格的屏幕截图。 not expanded
单击箭头按钮时我正在重新加载项目
self.collectionView.reloadItems(at: [indexPath])
sizeforitem函数
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let height = store.pickList[indexPath.row].expanded ? CGFloat(414) : CGFloat(168)
var width = CGFloat(0)
if Constants.isPad { width = (self.view.frame.size.width - 25 - 12 - 12) / 2 }
else { width = self.view.frame.size.width - 12 - 12 }
return CGSize(width: width, height: height)
}
CellforRowAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "detailCell", for: indexPath) as! DetailCollectionViewCell
.....
if data.expanded {
UIView.animate(withDuration: 0.25, animations: {
cell.bottomView.frame = CGRect(x: 0, y: 372, width: cell.frame.width, height: 42)
cell.expandArrow.setBackgroundImage(UIImage(named: "ok2"), for: .normal)
}, completion: { result in
UIView.animate(withDuration: 0.2, animations: {
cell.detailView.alpha = 1
})
})
}
else {
UIView.animate(withDuration: 0.25, animations: {
cell.detailView.alpha = 0
}, completion: { result in
UIView.animate(withDuration: 0.2, animations: {
cell.expandArrow.setBackgroundImage(UIImage(named: "ok"), for: .normal)
cell.bottomView.frame = CGRect(x: 0, y: 124, width: cell.frame.width, height: 42)
})
})
}
return cell
}
当我扩展单元格时,行也会扩展。 我的实现有什么问题? 谢谢
答案 0 :(得分:0)
之所以发生这种情况,是因为您似乎在使用(self.view.frame.size.width - 25 - 12 - 12) / 2
作为iPad上显示单元格的宽度。
仅将iPad的计算值除以2,即可为UICollectionView提供足够的空间以在同一行中显示多个单元格。对于其他设备,您无需将此数字除以2,从而只能在一行中显示1个单元格。
因此,您将必须更新计算以除以2,或者,如果是这样,对于iPad,您需要单元格仅为计算值的一半,请实施{{3 }}委托方法:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
if Constants.isPad {
// Replace this with whatever that suits your need.
return 70.0
} else {
// Replace this with whatever that suits your need.
return 10.0
}
}
这将为两个连续的项目提供足够的空间,以便仅一行显示一个项目。您可以修改上述值,以使单元格以您想要的方式显示。