Swift 无限轮播+自动无限轮播

2018-01-09  本文已影响18人  GloryMan

title: Swift Image browser
date: 2016-10-20 12:46:08
categories:


无限轮播+自动无限轮播

此工程中有两个实现方式,上面的是一种,下面的是另外一种。先上个图

carousel.gif

实现原理

第一种

extension GMImageCarouselView:UIScrollViewDelegate {
    
    // 拖动视图结束执行
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        
        // 滑动结束的时候调用(动画执行完毕)
        let index = scrollView.contentOffset.x / self.bounds.size.width
        pageIndex = index + 1
        
        if index == 0.0 {
            scrollView.setContentOffset(CGPoint(x:self.bounds.size.width * CGFloat(dataArr.count - 2), y:0), animated: false)
        }else if index == 4.0 {
            scrollView.setContentOffset(CGPoint(x:self.bounds.size.width , y:0), animated: false)
        }
        
        print("index: \(index)  and  pageIndex: \(pageIndex)")
    }
    
    // 代码控制滑动执行方法
    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {

        let index = scrollView.contentOffset.x / self.bounds.size.width
        
        pageIndex = index + 1

        if index == 0.0 {
            scrollView.setContentOffset(CGPoint(x:self.bounds.size.width * CGFloat(dataArr.count - 2), y:0), animated: false)
        }else if index == 4.0 {
            scrollView.setContentOffset(CGPoint(x:self.bounds.size.width , y:0), animated: false)
        }
    }
    // 开始移动scrollView
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        timer?.invalidate()
    }
    
    // 移动结束
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        self.setTimer()
    }
}

第二种

    func reloadImage() {
        
        var leftImageIndex = 0
        var rightImageIndex = 0
        
        let offset = scrollView.contentOffset
        
        if offset.x > 375 {
            currentImageIndex = (currentImageIndex + 1)%7
        }else if offset.x < 375 {
            currentImageIndex = (currentImageIndex + imageData.count - 1)%imageData.count
        }
        centerImageView.image = imageData[currentImageIndex]
        
        // 从新设置左右图片
        leftImageIndex = (currentImageIndex + imageData.count - 1)%imageData.count
        rightImageIndex = (currentImageIndex + 1)%imageData.count
        leftImageView.image = imageData[leftImageIndex]
        rightImageView.image = imageData[rightImageIndex]
        
    }
extension GMImageCarouseViewLowMemory:UIScrollViewDelegate {
    // 滑动停止
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        
        self.reloadImage()
        scrollView.setContentOffset(CGPoint(x:375,y:0), animated: false)
    }
    
    // 代码控制滑动
    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
        self.reloadImage()
        scrollView.setContentOffset(CGPoint(x:375,y:0), animated: false)
    }
    
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        timer?.invalidate()
        timer = nil
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        setTimer()
    }
}

使用方法

两种方法都一样

    func setView2() {
        bgView2 = GMImageCarouseViewLowMemory(frame: CGRect(x: 0, y: 300, width: 375, height: 250))
        self.view.addSubview(bgView2)
    }
    
    func setView1() {
        bgView1 = GMImageCarouselView(frame: CGRect(x: 0, y: 30, width: 375, height: 250))
        self.view.addSubview(bgView1)
    }

两种实现原理优缺

写在最后

demo地址

相关文章

我的另一篇博客轮播切换图片
博客

iOS 开发笔记
Auto Layout Club

上一篇下一篇

猜你喜欢

热点阅读