检查UICollectionViewFlowLayout的minimumInteritemSpacingForSectionAt方法的返回值是否为0,并确保在UICollectionViewDelegateFlowLayout协议中实现该方法并返回正确的值。下面是一个示例实现:
class MyCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func prepare() {
super.prepare()
minimumInteritemSpacing = 0
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
var leftMargin = sectionInset.left
var maxY: CGFloat = -1.0
attributes?.forEach { layoutAttribute in
if layoutAttribute.frame.origin.y >= maxY || layoutAttribute.frame.origin.x == sectionInset.left {
leftMargin = sectionInset.left
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
maxY = max(layoutAttribute.frame.maxY , maxY)
}
return attributes
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attribute = super.layoutAttributesForItem(at: indexPath)?.copy() as? UICollectionViewLayoutAttributes
var leftMargin: CGFloat = sectionInset.left
if indexPath.row > 0 {
let previousIndexPath = IndexPath(row: indexPath.row - 1, section: indexPath.section)
if let previousFrame = layoutAttributesForItem(at: previousIndexPath)?.frame {
leftMargin = previousFrame.origin.x + previousFrame.width + minimumInteritemSpacing
}
}
attribute?.frame.origin.x = leftMargin
return attribute
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
}
extension MyViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
}