我们一般情况下,自定义的collectionview item排序出来的效果是这样的!
![](https://img.haomeiwen.com/i1083309/ac47dd421c86d8d5.jpg)
这样就会出现不够一屏时,最上面一行无法补齐,或者最重要的,你的产品经理觉得你和安卓的显示有差别!
所以就有重新排序,拿到所有的item 并重新
那么,就要重写UICollectionViewFlowLayout的类
写一个类集成于UICollectionViewFlowLayout
func targetPositionWithItem(item: Int, resultX x: inout Int?, resultY y: inout Int?) {
let page = item / (self.itemCountPerRow * self.rowCount)
let theX = item % self.itemCountPerRow + page * self.itemCountPerRow
let theY = item / self.itemCountPerRow - page * self.rowCount
if x != nil {
x = theX
}
if y != nil {
y = theY
}
}
.
func originItemAtX(x: Int, y: Int) -> Int {
let item = x * self.rowCount + y
return item
}
实现效果
![](https://img.haomeiwen.com/i1083309/0f7049f0f1172982.jpg)
项目还做了关于collectionView整屏滑动的实现,
就是对所拿到的模型进行整数填充
// 这是关于如何让 item 整屏滑动对模型的操作 就是让数组补齐一屏 把空的UI隐藏并对didSelect方法进行判断
// 这里有第一屏不满少于5个对整个collectionview的高度进行改变
var activityModel = [lawActivityinfo]() {
didSet {
pageControl.numberOfPages = self.activityModel.count / 8 + 1
if activityModel.count < 5 {
self.mineLayout.rowCount = 1
let fix4 = activityModel.count % 4
let num4 = Int(4 - fix4)
if fix4 > 0 {
for _ in 1...num4 {
let model = lawActivityinfo()
activityModel.append(model)
}
}
self.collectionView.snp.updateConstraints({ (make) in
make.height.equalTo(Screen.autoScaleH(h: 120))
})
pageControl.frame = CGRect(x: 0, y: Screen.autoScaleH(h: 120) + 3, width: Screen.width, height: 10)
} else {
self.mineLayout.rowCount = 2
let fix = activityModel.count % 8
let fixNum = Int(8 - fix)
if fix > 0 {
for _ in 1...fixNum {
let model = lawActivityinfo()
activityModel.append(model)
}
}
self.collectionView.snp.updateConstraints({ (make) in
make.height.equalTo(Screen.autoScaleH(h: 230))
})
pageControl.frame = CGRect(x: 0, y: Screen.autoScaleH(h: 230) + 3, width: Screen.width, height: 10)
}
dog(activityModel.count)
collectionView.reloadData()
}
}
如果还有更好的实现方法请多多指教~~~
网友评论