1. 程式人生 > >iOS:UICollectionView實現無限輪播圖(Swift3)

iOS:UICollectionView實現無限輪播圖(Swift3)

這裡寫圖片描述
效果圖

原理:給collectionView設定多組一樣的資料,預設展示中間的那一組.當滾動到上一組或者下一組的時候採用無動畫的方式滾動到最中間的那一組.這樣就實現了檢視的無限輪播.

class MCCycleView: UIView, UICollectionViewDelegate, UICollectionViewDataSource {

    private var collectionView: UICollectionView!
    private var pageControl: UIPageControl!
    private var timer: Timer?

    lazy var picArr: [UIImage] = {
        return [UIImage(named: "1"
)!, UIImage(named: "2")!, UIImage(named: "3")!, UIImage(named: "4")!, UIImage(named: "5")!] }() private let CycleReuseIdentifier = "CycleReuseIdentifier" //組數 多少組都可以最少三組 private let MaxSections = 3 override init(frame: CGRect) { super.init
(frame: frame) setup() } private func setup() { //設定flowLayout屬性 let flowLayout = UICollectionViewFlowLayout() flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width, height: 150) flowLayout.minimumLineSpacing = 0 flowLayout.minimumInteritemSpacing
= 0 flowLayout.scrollDirection = .horizontal collectionView = UICollectionView(frame: frame, collectionViewLayout: flowLayout) collectionView.isPagingEnabled = true collectionView.register(MCCycleCell.self, forCellWithReuseIdentifier: CycleReuseIdentifier) collectionView.delegate = self collectionView.dataSource = self //預設滾動到中間的那一組 collectionView.scrollToItem(at: IndexPath(item: 0, section: MaxSections / 2), at: .left, animated: false) addSubview(collectionView) pageControl = UIPageControl() pageControl.numberOfPages = picArr.count pageControl.currentPageIndicatorTintColor = UIColor.orange addSubview(pageControl) //新增定時器 addTimer() //設定collectionView和pageControl的約束 collectionView.snp.makeConstraints { (make) in make.top.equalTo(self.snp.top) make.left.equalTo(self.snp.left) make.bottom.equalTo(self.snp.bottom) make.right.equalTo(self.snp.right) } pageControl.snp.makeConstraints { (make) in make.right.equalTo(self.snp.right).offset(-10) make.bottom.equalTo(self.snp.bottom).offset(-10) } } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func numberOfSections(in collectionView: UICollectionView) -> Int { return MaxSections } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return picArr.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CycleReuseIdentifier, for: indexPath) as! MCCycleCell cell.img = picArr[indexPath.item] return cell } //在這個方法中算出當前頁數 func scrollViewDidScroll(_ scrollView: UIScrollView) { let page = Int((scrollView.contentOffset.x + (collectionView?.bounds.width)! * 0.5) / (collectionView?.bounds.width)!) let currentPage = page % picArr.count pageControl?.currentPage = currentPage } //在開始拖拽的時候移除定時器 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { timer?.invalidate() timer = nil } //結束拖拽的時候重新新增定時器 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { addTimer() } //手動滑動 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { collectionView.scrollToItem(at: IndexPath(item: pageControl.currentPage, section: 1), at: .left, animated: false) } private func addTimer() { timer = Timer(timeInterval: 3, target: self, selector: #selector(nextImage), userInfo: nil, repeats: true) RunLoop.current.add(timer!, forMode: .commonModes) } @objc private func nextImage() { //獲取當前indexPath let currentIndexPath = collectionView.indexPathsForVisibleItems.last! //獲取中間那一組的indexPath let middleIndexPath = IndexPath(item: currentIndexPath.item, section: 1) //滾動到中間那一組 collectionView.scrollToItem(at: middleIndexPath, at: .left, animated: false) var nextItem = middleIndexPath.item + 1 var nextSection = middleIndexPath.section if nextItem == picArr.count { nextItem = 0 nextSection += 1 } collectionView.scrollToItem(at: IndexPath(item: nextItem, section: nextSection), at: .left, animated: true) } }
class MCCycleCell: UICollectionViewCell {

    private var ImgView: UIImageView = UIImageView()

    var img: UIImage? {
        didSet {
            ImgView.image = img
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(ImgView)
        ImgView.snp.makeConstraints { (make) in
            make.top.equalTo(self.snp.top)
            make.left.equalTo(self.snp.left)
            make.bottom.equalTo(self.snp.bottom)
            make.right.equalTo(self.snp.right)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

相關推薦

iOS:UICollectionView實現無限(Swift3)

效果圖 原理:給collectionView設定多組一樣的資料,預設展示中間的那一組.當滾動到上一組或者下一組的時候採用無動畫的方式滾動到最中間的那一組.這樣就實現了檢視的無限輪播. class

iOS最笨的辦法實現無限(網路載入)

簡單的做了一下: 使用方法: 把 請求返回的 圖片地址(字串型別)放進陣列中就行 可以使用SDWebImage(我就是用的這個)等。。需要自己匯入並引用,然後修改部分程式碼 .h檔案 // ScrollViewTimerView.h // Scrol

使用CollectionView實現無限(自動和手動輪)

使用UICollectionView封裝了一個無限迴圈的輪播圖,實現手動輪播和定時器自動輪播,傳入圖片陣列和標題陣列,即可實現圖片文字的輪播圖,並有點選事件,實現代理方法可實現點選事件的處理 ///呼叫 class HomeViewController: B

banner實現無限+下拉重新整理上拉載入+ 下拉時 listview 和一起重新整理

//首先把所需要的依賴包匯入  gson jar包、imageLoader jar包、banner1.4.9jar包、design jar包,,,然後匯入library,新建專案,把library匯入專案中 //新增許可權 <uses-permiss

android中無限實現(程式碼+文章+視訊)

Android開發中無限輪播圖的實現 前面在我們的論壇裡頭看到有同學們提問,怎麼樣去實現無限輪播。所以晚上回來就錄製了視訊了! 實現方式 最簡單的方式,就是使用viewpager來實現咯! 我們一開始只是實現圖片在viewPager上面可以滑動起

iOS之旅--scrollView實現無限

scrollView實現無限輪播 這裡為了實現真實的無限輪播,採用了 n+2 張圖片輪播,程式碼控制,顯示 第2 ~ 第n+1張圖片。 1、第1、n+1個圖片一樣,第2,n+2 個圖片一樣,具體看程式碼, //第一張圖片(向前拖拽,為了迴圈,第一張圖應

安卓最簡單的實現無限

Android中的輪播圖實現起來並不難,現在特別是商城類的APP中使用的特別多,自定義view和ViewPager都能很簡單的實現,之前找了幾篇博文都不具備無限輪播的功能,現在自己實現了無限輪播的功能,供大家參考學習和使用~~~~ 先看效果圖: 下面就看一下具體的程

Android 實現 一 :三方框架 自定義viewPager (CircleViewPager.)實現無限

使用流程:1  。 gradle中新增依賴compile 'com.zhpan.library:viewpager:1.0.3'2.在xml檔案中新增如下程式碼:<com.zhpan.viewpager.view.CircleViewPager andr

JavaScript實現

n) undefined add tom als one lin 例如 fun 當初學習JavaScript的時候,想學習輪播圖是怎麽寫的,結果在百度搜了半天也很難搜出一個完整的輪播圖案例。現在就分享一個用js寫的輪播圖供大家參考和學習,有什麽錯誤的地方或有更好

原生JavaScript實現無縫

原生 原生js ted 結束 阻止 time == 實現圖 put 無縫輪播圖是頁面常用的特效之一,然而在實際的開發過程中,大部分的開發者都會使用插件來對輪播圖進行開發,那麽它的底層到底是怎麽實現的呢,本文章將圍繞這一問題展開探討。 在討論如何利用原生JS實現圖片之間無縫切

JQuery實現旋轉

ann ima query 500px RR nbsp AS HR ++ css部分 <style> *{ margin: 0; padding: 0; } .co

JQuery實現

<div class="carousel-figure clearfix"> <div class="carsoul-box clearfix"> <a class="ig" href="#"><img src="image/

JQ實現簡易

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ini

FlyBanner無限

新增依賴 dependencies { compile 'com.recker.flybanner:flybanner:1.3' } MainActivity import android.os.Bundle; import android.support.v7.app

Vue專案中使用better-scroll實現一個

前言 better-scroll是一個非常非常強大的第三方庫 在移動端利用這個庫 不僅可以實現一個非常類似原生ScrollView的效果 也可以實現一個輪播圖的效果 這裡就先記錄一下自己實現這個效果的一些過程吧 思路 1.首先要確定自己的HTML結構 基本結構就是一個wrapper包含一個content

原生js實現簡單效果

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>首頁</title> <style> .father{

原生JS實現旋轉+文字內容切換

window.onload = function () { var arr = [ { // 1 width:120, top:11, left:87, opacity:20,

zepto框架以及原生方法實現無縫

注 :zepto實現在pc端模擬有一定的bug,把裡面的start=false註釋掉即可 Zepto實現。 HTML程式碼: <div class="homePageBanner"> <ul> <li><a hr

從網路獲取圖片實現無限 外賣公眾號開發找捌躍科技

//網路請求資料工具類 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader

Banner和ImageLoder無限(精簡版)

1.首先先在程式中匯入我們要使的依賴 implementation 'com.youth.banner:banner:1.4.9' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'