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

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

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

服務器之家 - 編程語言 - IOS - iOS利用UIScrollView實現無限滾動效果

iOS利用UIScrollView實現無限滾動效果

2021-02-22 14:32YungFan IOS

這篇文章主要給大家介紹了iOS如何利用UIScrollView實現無限滾動的效果,首先需要說明的是,文本所講的是一種"笨辦法",但是好理解且容易實現,在圖片不多的時候用它也無妨。感興趣的朋友們下面跟著小編一起來學習學習吧。

前言

眾所周知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

實現效果

iOS利用UIScrollView實現無限滾動效果

總結

好了,以上就是這篇文章的全部內容了,其實實現輪播現在最好的方案應該是使用uicollectionview,因為它是利用重用機制來實現的,性能會好很多,代碼寫起來類似。希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

延伸 · 閱讀

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

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

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

    liang199111312021-03-15
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

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

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

    jiangamh8882021-01-11
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

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

    執著丶執念5282021-01-16
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

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

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

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

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

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

    夢想家-mxj8922021-05-10
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

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

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

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

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

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

    LYSNote5432021-02-04
  • IOSiOS中UILabel實現長按復制功能實例代碼

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

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

    devilx12792021-04-02
主站蜘蛛池模板: 色综合久久天天综合 | 亚1洲二区三区四区免费 | 美女天天操| 我不卡影院手机在线观看 | 免费被黄网站在观看 | 成人免费视频大全 | 26uuu成人人网图片 | 熟睡中的麻麻大白屁股小说 | 日本指交 | 国产精品露脸国语对白99 | 99精品网 | free chinese麻豆 | 国产在线视频在线观看 | 欧美日韩亚洲第一区在线 | 美女扒开肌肌让男人桶 | 丝瓜秋葵番茄绿巨人在线观看 | jzjzjz日本在线观看 | 久久国产加勒比精品无码 | ipx358cn出差被男上司在线 | 鄂州一家三口完整版免费 | 精新精新国产自在现拍 | 日本免费在线观看 | 日本黄色网页 | 国产a一级毛片爽爽影院 | 思敏1一5集国语版免费观看 | 91制片厂制作传媒破解版免费 | 亚洲欧美国产精品久久久 | 欧美日韩中文字幕在线视频 | 爱情岛论坛亚洲自拍 | 九九热在线观看视频 | 99久久精品免费看国产高清 | 青青青视频免费线看 视频 青青青青青国产免费手机看视频 | 91人人在线 | 99精品免费在线观看 | 男女男在线精品网站免费观看 | 国产精品99久久免费观看 | 国产一区二区三区高清 | 继攵催眠女乱h调教 | aaa一级特黄 | 色久久一个亚洲综合网 | chinesexxxxhd人妖 chinesespanking调教 |