Swift: UICollectionView实现分页注意点

scrollViewWillEndDragging

scrollViewWillEndDragging:方法实现分页,此效果要求左右页在手机屏幕上都要显示一部分,如下图所示:

示例

代码如下:

/// 分页效果 手拖拽才调用
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        
        // 滑动距离太短时,没有动画效果,解决方法
        targetContentOffset.pointee = scrollView.contentOffset
        var targetXContentOffset = CGFloat(targetContentOffset.pointee.x)
        
        /// 滚动小部分也翻页 true向左滚动
        if self.leftScroll == true { // 左
            targetXContentOffset += itemWidth * 0.5
        }else{
            targetXContentOffset -= itemWidth * 0.5
        }
        // I use this way calculate newPage:
        var newPage = roundf(Float(targetXContentOffset / itemWidth))
        if newPage == -1 {
            newPage = 0
        }else if(Int(newPage) > self.selfExaminArr!.count - 1){
            newPage = Float(self.selfExaminArr!.count - 1)
        }
        var targetOffsetX: CGFloat = 0.0
        if newPage == 0 {
            // 第0页的偏移量
            targetOffsetX = -15
        }else if newPage == 1{
            // 第1页的偏移量
            targetOffsetX = itemWidth - 10
        }else{
            // 其他页 = 第1页的偏移量 + 除去第1页的偏移量
            targetOffsetX = (itemWidth - 10) + CGFloat(newPage-1) * (itemWidth + 5.0)   // itemWidth-10+15 间距
        }
        let newPosition = CGPoint (x:  targetOffsetX, y: targetContentOffset.pointee.y)
        // 动画间隔一下避免冲突
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.005) {
            scrollView.setContentOffset(newPosition, animated: true)
        }
        
    }

当手指点击cell时候,偏移量会归位(向左),最后查到是因为打开了分页功能collectionView.isPagingEnabled = true, 设置为false即可

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容