UICollectionView 实现横向分页滑动

2018-06-19  本文已影响0人  苏东没有坡
要实现的效果如下:
QQ20180619-173259-HD.gif

Github地址:https://github.com/Dwjiyi/HoriCollectionView

Demo 里面提供了两套方案

以下是第一套方案的核心代码:

    /// 即将开始拖拽
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        // 1. 标记拖动前的位置
        dragStartX = scrollView.contentOffset.x
    }
    
    /// 即将结束拖拽
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        // 2. 标记拖动后手指离开的位置
        let currentX = scrollView.contentOffset.x
        // 3. 计算手指拖动的距离
        let moveWidth = currentX - dragStartX
        // 4. 以0.5个itemWidth为界限, 多则滑到下一个/上一个,少则回到原位
        let movePage = Int(moveWidth / (itemSize.width * 0.5))
        if velocity.x > 0 || movePage > 0 {
            dragIndex = 1
        } else if velocity.x < 0 || movePage < 0 {
            dragIndex = -1
        } else {
            dragIndex = 0
        }
        // 5. 计算当前cell中心点的index
        let index = Int((dragStartX + (itemSize.width + minimumInteritemSpacing) * 0.5) / (itemSize.width + minimumLineSpacing))
        print("scrollViewWillEndDragging: \(index)")
        // 最后一个cell继续往右滑, 不滑了
        if (index == itemCount - 1 && dragIndex == 1) {
            return
        }
        collectionView.scrollToItem(at: IndexPath(row: index + dragIndex, section: 0), at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
    }
    
    /// 滑动即将开始减速
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        let index = Int((dragStartX + (itemSize.width + minimumInteritemSpacing) * 0.5) / (itemSize.width + minimumLineSpacing))
        print("scrollViewWillBeginDecelerating: \(index)")
        
        if (index == itemCount - 1 && dragIndex == 1) {
            return
        }
        collectionView.scrollToItem(at: IndexPath(row: index + dragIndex, section: 0), at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
    }
上一篇下一篇

猜你喜欢

热点阅读