一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS Swift利用UICollectionView實現無限輪播功能(原理)詳解

iOS Swift利用UICollectionView實現無限輪播功能(原理)詳解

2021-05-13 17:13楓developer IOS

無線輪播圖的實現方式有很多,下面這篇文章主要給大家介紹了關于iOS Swift利用UICollectionView實現無限輪播功能(原理)的相關資料,需要的朋友可以參考下

前言

作為一個資深(自認為)ios程序猿,會經常用到輪播圖,上一次使用uiscrollview實現無限輪播的效果,這一次在swift語言中,我使用uicollectionview再為大家講解一次無限輪播的實現原理。

先上圖:

iOS Swift利用UICollectionView實現無限輪播功能(原理)詳解
uicollectionview-無限輪播.gif

首先需要實現了就是uicollectionview的分頁,這個很簡單:

?
1
collectionview.ispagingenabled = true

接下來就是原理,在uicollectionview的兩端需要先添加兩張圖片,首段需要添加最后一張圖片,而尾端需要添加第一張圖片,然后在中間的位置上一次添加各個圖片。這個其實是很容易實現的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
}

這樣在滑動的時候,通過偏移量就可以實現無限輪播的效果了。當滑動停止時判斷偏移量,當偏移量為0時(視圖上顯示的是最后一張圖片),這時候就直接調動調整偏移量的方法,把uicollectionview偏移到最后一張圖片的位置。滑動到尾端時是同理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
func scrollviewdidenddecelerating(_ scrollview: uiscrollview) {
/// 當uiscrollview滑動到第一位停止時,將uiscrollview的偏移位置改變
if (scrollview.contentoffset.x == 0) {
 scrollview.contentoffset = cgpoint(x: cgfloat(self.imagenamelist.count) * kscreenwidth,y: 0)
 self.pagecontrol.currentpage = self.imagenamelist.count
 /// 當uiscrollview滑動到最后一位停止時,將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
}
}

其實原理很簡單,個人認為使用uicollectionview實現無限輪播比起uiscrollview更加實用并且便于維護,接下來我將代碼全部列一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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() {
 /// 設置數據
 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) {
 /// 當uiscrollview滑動到第一位停止時,將uiscrollview的偏移位置改變
 if (scrollview.contentoffset.x == 0) {
  scrollview.contentoffset = cgpoint(x: cgfloat(self.imagenamelist.count) * kscreenwidth,y: 0)
  self.pagecontrol.currentpage = self.imagenamelist.count
  /// 當uiscrollview滑動到最后一位停止時,將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,喜歡的話可以點一下收藏哈,用uiscrollview實現輪播的原理在:http://www.ythuaji.com.cn/article/163332.html,大家需要的話也可以了解一下。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.jianshu.com/p/0ba33e59a784

延伸 · 閱讀

精彩推薦
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
主站蜘蛛池模板: 国产在线伊人 | 99在线视频观看 | 丰满艳妇亲伦视频 | 亚洲欧美日韩天堂 | 欧美久在线观看在线观看 | 国产午夜一区二区在线观看 | 特黄特色大片免费高清视频 | 日本sss在线高清观看 | 免费观看成年人视频 | 成人高辣h视频一区二区在线观看 | 大伊香蕉精品视频一区 | 波多野结衣178部中文字幕 | 国产自精品 | 日本在线看 | 白丝女榨干蹂躏我 | 亚洲AV 日韩 国产 有码 | np高h疯狂黄暴宫口 narutomanga玖辛奈之乳 | 成人精品mv视频在线观看 | 国产私人影院 | 美女张开双腿让男人捅 | 色天天综合色天天看 | 99久久一香蕉国产线看观看 | 青春草在线观看精品免费视频 | 婷婷丁香视频 | 久久青草免费91线频观看站街 | 紧身牛仔裤美女被啪啪久久网 | 娇妻被老外疯狂调教 | 日本免费在线观看 | 欧美又大又粗又爽视频 | 亚洲色图2 | 国内精品91久久久久 | 99re热| 日韩精品高清自在线 | 精品国产一区二区三区在线观看 | 2012年中文字幕在线看 | 亚洲精品国产综合久久一线 | 2021精品国夜夜天天拍拍 | 99久久精品免费观看区一 | 欧美在线播放成人免费 | 日本视频在线免费看 | 美女张开双腿让男人捅 |