iOS Swift使用UICollectionView實(shí)現(xiàn)無限輪播(原理)

上一次使用UIScrollView實(shí)現(xiàn)無限輪播的效果闺鲸,這一次在Swift語言中凤巨,我使用UICollectionView再為大家講解一次無限輪播的實(shí)現(xiàn)原理味廊。先上圖:


UICollectionView-無限輪播.gif

首先需要實(shí)現(xiàn)了就是UICollectionView的分頁介汹,這個(gè)很簡(jiǎn)單:

collectionView.isPagingEnabled = true

接下來就是原理巡雨,在UICollectionView的兩端需要先添加兩張圖片,首段需要添加最后一張圖片暮现,而尾端需要添加第一張圖片还绘,然后在中間的位置上一次添加各個(gè)圖片。這個(gè)其實(shí)是很容易實(shí)現(xiàn)的:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
        
        /// 給圖片賦值(在首尾分別添加兩張圖片)
        if (indexPath.row == 0) {
            cell.imageName = imageNameList.last
        } else if (indexPath.row == self.imageNameList.count + 1) {
            cell.imageName = imageNameList.first
        } else {
            cell.imageName = imageNameList[indexPath.row - 1]
        }
        
        return cell
    }

這樣在滑動(dòng)的時(shí)候栖袋,通過偏移量就可以實(shí)現(xiàn)無限輪播的效果了拍顷。當(dāng)滑動(dòng)停止時(shí)判斷偏移量,當(dāng)偏移量為0時(shí)(視圖上顯示的是最后一張圖片)塘幅,這時(shí)候就直接調(diào)動(dòng)調(diào)整偏移量的方法昔案,把UICollectionView偏移到最后一張圖片的位置〉缦保滑動(dòng)到尾端時(shí)是同理踏揣。

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        /// 當(dāng)UIScrollView滑動(dòng)到第一位停止時(shí),將UIScrollView的偏移位置改變
        if (scrollView.contentOffset.x == 0) {
            scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
            self.pageControl.currentPage = self.imageNameList.count
            /// 當(dāng)UIScrollView滑動(dòng)到最后一位停止時(shí)匾乓,將UIScrollView的偏移位置改變
        } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
            scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
            self.pageControl.currentPage = 0
        } else {
            self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
        }
    }

其實(shí)原理很簡(jiǎn)單捞稿,個(gè)人認(rèn)為使用UICollectionView實(shí)現(xiàn)無限輪播比起UIScrollView更加實(shí)用并且便于維護(hù),接下來我將代碼全部列一下:

import UIKit

let kScreenWidth = UIScreen.main.bounds.width

class ViewController: UIViewController {
    
    lazy var collectionView: UICollectionView = {
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.minimumLineSpacing = 0
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.scrollDirection = .horizontal
        flowLayout.itemSize = CGSize(width: kScreenWidth, height: 200)
        
        let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 200), collectionViewLayout: flowLayout)
        
        collectionView.isPagingEnabled = true
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.backgroundColor = UIColor.white
        collectionView.delegate = self
        collectionView.dataSource = self
        self.view.addSubview(collectionView)
        
        return collectionView
    }()
    
    lazy var pageControl: UIPageControl = {
        let pageControl = UIPageControl(frame: CGRect(x: 0, y: 150, width: kScreenWidth, height: 50))
        
        pageControl.numberOfPages = self.imageNameList.count
        pageControl.currentPage = 0
        
        pageControl.tintColor = UIColor.black
        pageControl.pageIndicatorTintColor = UIColor.gray;
        
        return pageControl;
    }()
    
    lazy var imageNameList: [String] = {
        let imageList = ["image0", "image1", "image2", "image3"]
        
        return imageList
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupController()
    }
    
    func setupController() {
        /// 設(shè)置數(shù)據(jù)
        collectionView.register(ImageCollectionViewCell.self, forCellWithReuseIdentifier: "ImageCollectionViewCell")
        
        collectionView.reloadData()
        collectionView.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
        
        self.view.addSubview(pageControl)
    }

}

extension ViewController: UICollectionViewDataSource {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        /// 這步只是防止崩潰
        if (imageNameList.count == 0) {
            return 0
        }
        return imageNameList.count + 2
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
        
        /// 給圖片賦值(在首尾分別添加兩張圖片)
        if (indexPath.row == 0) {
            cell.imageName = imageNameList.last
        } else if (indexPath.row == self.imageNameList.count + 1) {
            cell.imageName = imageNameList.first
        } else {
            cell.imageName = imageNameList[indexPath.row - 1]
        }
        
        return cell
    }
    
}

extension ViewController: UICollectionViewDelegate {
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        /// 當(dāng)UIScrollView滑動(dòng)到第一位停止時(shí)拼缝,將UIScrollView的偏移位置改變
        if (scrollView.contentOffset.x == 0) {
            scrollView.contentOffset = CGPoint(x: CGFloat(self.imageNameList.count) * kScreenWidth,y: 0)
            self.pageControl.currentPage = self.imageNameList.count
            /// 當(dāng)UIScrollView滑動(dòng)到最后一位停止時(shí)娱局,將UIScrollView的偏移位置改變
        } else if (scrollView.contentOffset.x == CGFloat(self.imageNameList.count + 1) * kScreenWidth) {
            scrollView.contentOffset = CGPoint(x: kScreenWidth,y: 0)
            self.pageControl.currentPage = 0
        } else {
            self.pageControl.currentPage = Int(scrollView.contentOffset.x / kScreenWidth) - 1
        }
    }
    
}

/// collectionView圖片的cell
class ImageCollectionViewCell: UICollectionViewCell {
    
    /// 顯示的圖片
    let imageView = UIImageView()
    var imageName: String? = "" {
        didSet {
            if let name = imageName {
                imageView.image = UIImage(named: name)
            }
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupCell();
    }
    
    /// 初始化視圖
    func setupCell() {
        imageView.frame = self.bounds
        contentView.addSubview(imageView)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

ok,喜歡的話可以點(diǎn)一下收藏哈咧七,用UIScrollView實(shí)現(xiàn)輪播的原理在http://www.reibang.com/p/7c4b79e5b123衰齐,大家需要的話也可以了解一下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末继阻,一起剝皮案震驚了整個(gè)濱河市耻涛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘟檩,老刑警劉巖犬第,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芒帕,居然都是意外死亡歉嗓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門背蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鉴分,“玉大人,你說我怎么就攤上這事带膀≈菊洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵垛叨,是天一觀的道長(zhǎng)伦糯。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么敛纲? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任喂击,我火速辦了婚禮,結(jié)果婚禮上淤翔,老公的妹妹穿的比我還像新娘翰绊。我一直安慰自己,他們只是感情好旁壮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布监嗜。 她就那樣靜靜地躺著,像睡著了一般抡谐。 火紅的嫁衣襯著肌膚如雪裁奇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天麦撵,我揣著相機(jī)與錄音框喳,去河邊找鬼。 笑死厦坛,一個(gè)胖子當(dāng)著我的面吹牛五垮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杜秸,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼放仗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了撬碟?” 一聲冷哼從身側(cè)響起诞挨,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呢蛤,沒想到半個(gè)月后惶傻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡其障,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年银室,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励翼。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜈敢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汽抚,到底是詐尸還是另有隱情抓狭,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布造烁,位于F島的核電站否过,受9級(jí)特大地震影響午笛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苗桂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一药磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧誉察,春花似錦、人聲如沸惹谐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氨肌。三九已至鸿秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怎囚,已是汗流浹背卿叽。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恳守,地道東北人考婴。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像催烘,于是被迫代替她去往敵國和親沥阱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1伊群、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,982評(píng)論 3 119
  • 有些話 見面的時(shí)候說不出口 寫在紙上又顯得矯情 趁現(xiàn)在記性還尚未減退 不如一吐為快 我呢 算半個(gè)固執(zhí)的人吧 這些年...
    面具控閱讀 225評(píng)論 0 2
  • 連續(xù)兩天都會(huì)在半夜兩點(diǎn)醒來考杉,習(xí)慣性打開微信,找到你舰始,發(fā)消息告訴你我想你了崇棠,然后消息被送達(dá)就好安心。撤回消息丸卷,繼續(xù)安...
    魍小七閱讀 246評(píng)論 0 0
  • 過去我一直在迷茫 摸索不到門在何處 周邊都是一片漫無邊際的白霧 獨(dú)自一人孤單地行走 心中的寂寥枕稀、落寞 無人訴說 亦...
    獅之鄉(xiāng)閱讀 339評(píng)論 0 0
  • 【Day16】《富爸爸窮爸爸》p103-132 001可以獲得資產(chǎn) 不需要我到場(chǎng)就可以正常運(yùn)作的業(yè)務(wù)。我擁有它們谜嫉,...
    天使多肉閱讀 272評(píng)論 3 1