前言
眾所周知uiscrollview 的無限滾動主要應用在圖片輪播器、歡迎界面等場景。它的原理是在要顯示的圖片前后各加一張圖片即在第一張圖片之前放最后一張圖片,在最后一張圖片之后放第一張圖片,然后在滾動到邊緣的時候,巧妙的過渡一下就可以"瞞天過海","以假亂真"的造成無限滾動的假象。網絡上有很多只用三張或兩張圖片實現的方法,效率比這個方法高,但實現起來稍微麻煩一點,有興趣的可以去深入研究。
實現步驟
1、根據需求準備幾張圖片,在網上找了5張圖片,分別命名為 img_01,img_02,img_03,img_04,img_05 。
2、代碼實現,主要分為:添加uiscrollview,添加顯示圖片,添加uipagecontrol,然后監聽uiscrollview的滾動,根據滾動的位置來設置uipagecontrol,最重要的是對于滾動到兩個邊緣時要特殊處理一下
代碼如下:
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
|
#import "viewcontroller.h" //屏幕寬度 #define screen_width [uiscreen mainscreen].bounds.size.width //圖片高度 #define img_height 180 //要顯示的圖片總數 #define max_size 7 #import "viewcontroller.h" @interface viewcontroller () <uiscrollviewdelegate> //滾動視圖 @property (strong, nonatomic) uiscrollview *loopscrollview; //指示器 @property (strong, nonatomic) uipagecontrol *pageindicator; //要展示的圖片數組 @property(strong, nonatomic) nsmutablearray *imgarray; @end @implementation viewcontroller //懶加載數組 -(nsmutablearray *)imgarray { if (_imgarray == nil) { _imgarray = [[nsmutablearray alloc]initwithcapacity:max_size]; //在要展示的5張圖片的前后各加一張圖片,第一張前面加第五張,第五張后面加第一張 [_imgarray addobject:[uiimage imagenamed:@ "img_05.jpg" ]]; for ( int i = 1; i< max_size - 1; i++) { nsstring *imgname = [[nsstring alloc]initwithformat:@ "img_0%d.jpg" , i]; [_imgarray addobject:[uiimage imagenamed:imgname]]; } [_imgarray addobject:[uiimage imagenamed:@ "img_01.jpg" ]]; } return _imgarray; } - ( void )viewdidload { [super viewdidload]; [self setupscrollview]; [self setuppagecontrol]; } /** * 創建uiscrollview并設置其屬性 */ -( void )setupscrollview { uiscrollview *sc = [[uiscrollview alloc]initwithframe:cgrectmake(0, 64, screen_width, img_height)]; //創建uiimageview并添加到uiscrollview中 for ( int i = 0; i< max_size; i++) { uiimageview *img = [[uiimageview alloc]initwithimage:[self.imgarray objectatindex:i]]; img.frame = cgrectmake(screen_width * i, 0, screen_width, img_height); [sc addsubview:img]; } //設置uiscrollview的屬性 sc.contentsize = cgsizemake(screen_width * self.imgarray.count, img_height); sc.showshorizontalscrollindicator = no; sc.pagingenabled = yes; //剛開始應該滾動到第二張顯示,因為第一張其實是最后一張圖片 [sc setcontentoffset:cgpointmake(screen_width, 0) animated:no]; //設置代理并添加到當前view中 sc.delegate = self; [self.view addsubview:sc]; self.loopscrollview = sc; } /** * 創建uipagecontrol并設置其屬性 */ -( void )setuppagecontrol { //注意frame,這樣設置可以居中顯示 uipagecontrol *pc = [[uipagecontrol alloc]initwithframe:cgrectmake(self.view.center.x - 50, cgrectgetmaxy(self.loopscrollview.frame) - 25 , 100, 25)]; //設置uipagecontrol的屬性并添加到當前view中 pc.numberofpages = max_size - 2; pc.currentpage = 0; pc.pageindicatortintcolor = [uicolor redcolor]; [self.view addsubview:pc]; self.pageindicator = pc; } //uiscrollview的代理方法,在該方法中改變uipagecontrol并且處理邊緣滾動 -( void )scrollviewdidenddecelerating:(uiscrollview *)scrollview { //獲取當前uiscrollview的位置 cgpoint offset = [scrollview contentoffset]; //算出滾動到第幾頁 int currentpage = offset.x/screen_width; //設置uipagecontrol self.pageindicator.currentpage = currentpage - 1; //對最后一張和第一張要進行特殊處理 //1、如果是第一張 if (currentpage == 0) { //下面兩個方法任選其一都可以達到效果,但是注意動畫一定要設置為no,不然會有視覺會有辣眼睛的感覺 //方法1 [self.loopscrollview setcontentoffset:cgpointmake(screen_width * (max_size-2), 0) animated:no]; //方法2,該方法要求設置contentsize時,任一方向就算不滾動也不能為0,否則無效 //[self.loopscrollview scrollrecttovisible:cgrectmake(screen_width * (max_size-2), 0, screen_width, img_height) animated:no]; self.pageindicator.currentpage = max_size - 2; } //2、如果是最后一張 else if (currentpage == max_size - 1) { [self.loopscrollview setcontentoffset:cgpointmake(screen_width, 0) animated:no]; //[self.loopscrollview scrollrecttovisible:cgrectmake(screen_width, 0, screen_width, img_height) animated:no]; self.pageindicator.currentpage = 0; } } @end |
實現效果
總結
好了,以上就是這篇文章的全部內容了,其實實現輪播現在最好的方案應該是使用uicollectionview,因為它是利用重用機制來實現的,性能會好很多,代碼寫起來類似。希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。