Swift:兩個UIImageView實現(xiàn)無限循環(huán)輪播(支持自動輪播)

這兩年swift火得有點不像話,作為一個iOS開發(fā)者,Apple大大推出的編程語言是必須要學的,于是乎好多iOS攻城獅不是在用swift寫項目就是在用swift改項目的路上。我著手的項目之前一直都是用純OC編寫的,因為項目較大,而且版本更新頻率比較高,一直都沒有轉swift。趁著最近項目要發(fā)版本,手中的事不是很多,就開始試著寫一個swift版本(論裝逼的最高境界)。

Swift發(fā)布以后,一直都是看文檔,沒怎么用swift寫過項目,趁著這次機會嘗試用swift寫手中的項目。由于首頁中就有無限輪播,自然著手點也從這開始。使用兩個UIImageView+UIScrollView實現(xiàn),二話不說,先看效果圖:


無限循環(huán)輪播.gif

先說一下原理,這里假設圖片的寬度為imgWidth,高度為imgHeight,scrollView的寬=圖片的寬,scrollView的高=圖片的高, 設置 scrollView 的 contentSize = 3倍圖片寬度,高度相同,將第一個imageView放在scrollView的中間,第二個 imageView 放在最后,因為暫時不顯示,所以放在最前面和最后面是一樣的,再設置 scrollView 的偏移量為圖片寬度(剛好顯示中間的 imageView)。具體代碼如下:

//圖片寬度
imgWidth  = frame.size.width
//圖片高度
imgHeight = frame.size.height
    
scrollView = UIScrollView.init(frame: frame)
scrollView?.delegate = self
//設置分頁
scrollView?.pagingEnabled = true
scrollView?.showsHorizontalScrollIndicator = false
//設置 contentSize 為圖片3倍寬度,高度相同
scrollView?.contentSize = CGSizeMake(3*imgWidth!, imgHeight!)
scrollView?.contentOffset = CGPointMake(imgWidth!, 0)
self.addSubview(scrollView!)
    
//將當前顯示視圖放在 scrollView 中間
currentView = UIImageView.init(frame: CGRectMake(imgWidth!, 0, imgWidth!, imgHeight!))
scrollView?.addSubview(currentView!)
    
//下一視圖放在中間視圖后面
nextView = UIImageView.init(frame: CGRectMake(2*imgWidth!, 0, imgWidth!, imgHeight!))
scrollView?.addSubview(nextView!)

上面設置完初始數(shù)據(jù)后,接下來就要定義一個變量 direction 來記錄 scrollView 的滾動方向,這里我們先定義一個滾動方向枚舉類型:

enum Direction
{
     case DirectionLeft     //向左滾動
     case DirectionRight    //向右滾動
     case DirectionNone     //無滾動
}

direction是記錄 scrollView 的滾動方向的變量,它的值是根據(jù)滑動方向來改變的,所以要在 scrollView 中的代理方法監(jiān)聽 scrollView的滾動方向并賦值給direction。

//MARK: -----UIScrollViewDelegate-----
func scrollViewDidScroll(scrollView: UIScrollView)
{
    let offsetX = scrollView.contentOffset.x;
    self.direction = offsetX > imgWidth! ? .DirectionLeft : offsetX < imgWidth! ? .DirectionRight : .DirectionNone
}

以前在 OC中我們可以用 KVO 來實現(xiàn),但是 Swift 中沒有 KVO,所以要想到重寫 setter 方法來實現(xiàn)。

var direction       :Direction = .DirectionNone  //滾動方向
{
    //設置新值之前
    willSet
    {
        if newValue == direction
        {
            return
        }
    }
    //設置新值之后
    didSet
    {
        //向右滾動
        if direction == .DirectionRight
        {
            nextView?.frame = CGRectMake(0, 0, imgWidth!, imgHeight!)
            nextIndex = currentIndex!-1
            if nextIndex < 0
            {
                nextIndex = (ADsArray?.count)! - 1
            }
        }
        //向左滾動
        if direction == .DirectionLeft
        {
            nextView?.frame = CGRectMake(imgWidth!*2, 0, imgWidth!, imgHeight!)
            nextIndex = (currentIndex!+1) % (ADsArray?.count)!
        }
        nextView?.backgroundColor = ADsArray![nextIndex!]
    }
}

上面代碼可以看到,在滾動方向發(fā)生變化時我們要改變 nextView 的 frame,以及它對應的圖片(這里因為是 demo,所以直接使用了color)。當滾動結束后 scrollView 會調用scrollViewDidEndDecelerating(scrollView: UIScrollView)這個方法,此時我們要改變currentView的 frame 以及它對應的圖片(即 nextView 對應的圖片)。

let offset = self.scrollView!.contentOffset.x;
let index = offset / self.imgWidth!
//1表示沒有滾動
if index == 1
{
     return
}
self.currentIndex = self.nextIndex
self.pageControl?.currentPage = self.currentIndex!
self.currentView?.frame = CGRectMake(self.imgWidth!, 0, self.imgWidth!, self.imgHeight!)
self.currentView?.backgroundColor = self.nextView?.backgroundColor
self.scrollView?.contentOffset = CGPointMake(imgWidth!, 0);

關于自動輪播這里不再贅述,詳情點擊這里查看整個工程demo的實現(xiàn),如有疑問和寫的不好的地方還望各位多多包涵,也歡迎指正,如果對您確實產(chǎn)生了有利的影響也希望您能賞個star!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容