亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現UIScrollView的無限輪播功能(原理)詳解

2019-10-21 18:39:37
字體:
來源:轉載
供稿:網友

前言

同學們在寫需求的時候肯定會時常用到UIScrollView。

UIScrollView控件是什么?

(1)移動設備的屏幕?大?小是極其有限的,因此直接展?示在?用戶眼前的內容也相當有限

(2)當展?示的內容較多,超出?一個屏幕時,?用戶可通過滾動?手勢來查看屏幕以外的內容

(3)普通的UIView不具備滾動功能,不能顯?示過多的內容

(4)UIScrollView是一個能夠滾動的視圖控件,可以?用來展?示?大量的內容,并且可以通過滾 動查看所有的內容

  (5) 舉例:手機上的“設置”、其他?示例程序

而說到UIScrollView,大家最先想到的肯定就是它上面的無限輪播功能。蘋果在UIScrollView上并沒有提供相應的方法讓大家實現輪播,所以就需要通過代碼進行處理來實現。

先上圖

iOS,UIScrollView,無限輪播
無限輪播效果圖.gif

我先給大家講講其實現的原理:

我們假設用幾張圖片實現輪播效果。首先,我們需要打開UIScrollView的分頁滑動

/// 分頁滑動_scrollView.scrollEnabled = YES;

它方便的幫助我們實現了輪播的效果,然后就需要我們來實現“無限的”輪播。接下來,我們就需要擺放圖片了,在擺放圖片時需要注意,我們需要在第一張圖片的位置擺放最后一張圖片(可能有點懵哈,不過不要著急慢慢往下看),然后我們依次擺放圖片(從第一張到最后一張),最后在所有圖片的尾部我們再放上第一張圖片。這樣我們就多放了兩張圖片(分別在首尾多放了一張圖)。我把對應的方法寫一下:

/// 將圖片放置在UIScrollView上-(void)setupImage { /// 在UIScrollView的最前面添加一張圖片 UIImageView *firstImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, self.scrollView.frame.size.height)]; /// 圖片名是最后一張圖片 firstImageView.image = [UIImage imageNamed:self.imageNameList.lastObject]; [self.scrollView addSubview:firstImageView];  /// 添加圖片 for (NSInteger index = 0; index < self.imageNameList.count; index ++) { /// UIScrollView上的每一張圖片 UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((index + 1) * kScreenWidth, 0, kScreenWidth, self.scrollView.frame.size.height)]; imageView.image = [UIImage imageNamed:self.imageNameList[index]];  [self.scrollView addSubview:imageView]; self.scrollView.contentSize = CGSizeMake((index + 2) * self.scrollView.bounds.size.width, 0); }  /// 在UIScrollView的最后面添加一張圖片 UIImageView *lastImageView = [[UIImageView alloc] initWithFrame:CGRectMake((self.imageNameList.count + 1) * kScreenWidth, 0, kScreenWidth, self.scrollView.frame.size.height)]; /// 圖片名是第一張圖片 lastImageView.image = [UIImage imageNamed:self.imageNameList.firstObject]; [self.scrollView addSubview:lastImageView];  /// 設置UIScrollView的偏移量 self.scrollView.contentSize = CGSizeMake((self.imageNameList.count + 2) * self.scrollView.bounds.size.width, 0);  /// 設置UIScrollView的起始偏移距離(將第一張圖片跳過) self.scrollView.contentOffset = CGPointMake(kScreenWidth, 0);  /// 圖片總數 self.pageControl.numberOfPages = self.imageNameList.count; self.pageControl.currentPage = 0;}

其實,如果大家看到這里,應該就會大致明白無線輪播的實現原理了。接下來就是最后一步,在UIScrollView的代理方法里面寫邏輯:判斷UIScrollView的偏移量,當其滑動到首位時(顯示的是最后一張圖片),滑動停止,就把偏移量修改最后面圖片的位置上(倒數第二張)。同理,當UIScrollView滑動到最后時(顯示的是第一張圖片),滑動停止,就把偏移量修改到第一張圖片的位置上(正數第二張)。

#pragma mark - UIScrollViewDelegate-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { /// 當UIScrollView滑動到第一位停止時,將UIScrollView的偏移位置改變 if (scrollView.contentOffset.x == 0) { scrollView.contentOffset = CGPointMake(self.imageNameList.count * kScreenWidth, 0); self.pageControl.currentPage = self.imageNameList.count; /// 當UIScrollView滑動到最后一位停止時,將UIScrollView的偏移位置改變 } else if (scrollView.contentOffset.x == (self.imageNameList.count + 1)* kScreenWidth) { scrollView.contentOffset = CGPointMake(kScreenWidth, 0); self.pageControl.currentPage = 0; } else { self.pageControl.currentPage = scrollView.contentOffset.x / kScreenWidth - 1; }}

ok,原理其實就是這樣。在首尾多加兩張圖片當做占位符,然后當UIScrollView滑動到占位符的位置時,改變UIScrollView的偏移量,簡單且方便。下面就是全部代碼:

#import "ViewController.h"#define kScreenWidth [UIScreen mainScreen].bounds.size.width@interface ViewController () <UIScrollViewDelegate>/// 滑動控制器@property (nonatomic, strong) UIScrollView *scrollView;/// 圖片數組@property (nonatomic, strong) NSArray<NSString *> *imageNameList;/// 頁碼控制器@property (nonatomic, strong) UIPageControl *pageControl;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];  // 設置圖片名的數組 self.imageNameList = @[@"image0", @"image1", @"image2", @"image3"];  // 添加圖片 [self setupImage];}/// 將圖片放置在UIScrollView上-(void)setupImage { /// 在UIScrollView的最前面添加一張圖片 UIImageView *firstImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, self.scrollView.frame.size.height)]; /// 圖片名是最后一張圖片 firstImageView.image = [UIImage imageNamed:self.imageNameList.lastObject]; [self.scrollView addSubview:firstImageView];  /// 添加圖片 for (NSInteger index = 0; index < self.imageNameList.count; index ++) { /// UIScrollView上的每一張圖片 UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((index + 1) * kScreenWidth, 0, kScreenWidth, self.scrollView.frame.size.height)]; imageView.image = [UIImage imageNamed:self.imageNameList[index]];  [self.scrollView addSubview:imageView]; self.scrollView.contentSize = CGSizeMake((index + 2) * self.scrollView.bounds.size.width, 0); }  /// 在UIScrollView的最后面添加一張圖片 UIImageView *lastImageView = [[UIImageView alloc] initWithFrame:CGRectMake((self.imageNameList.count + 1) * kScreenWidth, 0, kScreenWidth, self.scrollView.frame.size.height)]; /// 圖片名是第一張圖片 lastImageView.image = [UIImage imageNamed:self.imageNameList.firstObject]; [self.scrollView addSubview:lastImageView];  /// 設置UIScrollView的偏移量 self.scrollView.contentSize = CGSizeMake((self.imageNameList.count + 2) * self.scrollView.bounds.size.width, 0);  /// 設置UIScrollView的起始偏移距離(將第一張圖片跳過) self.scrollView.contentOffset = CGPointMake(kScreenWidth, 0);  /// 圖片總數 self.pageControl.numberOfPages = self.imageNameList.count; self.pageControl.currentPage = 0;}#pragma mark - UIScrollViewDelegate-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { /// 當UIScrollView滑動到第一位停止時,將UIScrollView的偏移位置改變 if (scrollView.contentOffset.x == 0) { scrollView.contentOffset = CGPointMake(self.imageNameList.count * kScreenWidth, 0); self.pageControl.currentPage = self.imageNameList.count; /// 當UIScrollView滑動到最后一位停止時,將UIScrollView的偏移位置改變 } else if (scrollView.contentOffset.x == (self.imageNameList.count + 1)* kScreenWidth) { scrollView.contentOffset = CGPointMake(kScreenWidth, 0); self.pageControl.currentPage = 0; } else { self.pageControl.currentPage = scrollView.contentOffset.x / kScreenWidth - 1; }}#pragma mark - Get方法-(UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 200)]; _scrollView.pagingEnabled = YES; _scrollView.clipsToBounds = NO; _scrollView.scrollEnabled = YES; _scrollView.delegate = self; _scrollView.bounces = NO; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.showsVerticalScrollIndicator = NO;  [self.view addSubview:_scrollView]; }  return _scrollView;}-(UIPageControl *)pageControl { if (!_pageControl) { _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 150, kScreenWidth, 50)];  _pageControl.pageIndicatorTintColor = [UIColor blackColor]; _pageControl.currentPageIndicatorTintColor = [UIColor grayColor];  [self.view addSubview:_pageControl]; }  return _pageControl;}@end

 

總結

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
少妇久久久久久| 91亚洲国产精品| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品有码在线| 亚洲国产福利在线| 亚洲午夜性刺激影院| 国产精品a久久久久久| 日韩av色在线| 久久精品视频免费播放| 国产精品视频内| 欧美在线中文字幕| 国产成人福利夜色影视| 午夜精品国产精品大乳美女| 亚洲欧洲激情在线| 久久影院免费观看| 亚洲美女精品久久| 久久久久久久久久亚洲| 2019中文字幕全在线观看| 精品国产欧美一区二区五十路| 欧美激情videoshd| 国外成人在线直播| 国产精品一区二区女厕厕| 九九热精品视频国产| 97在线视频免费观看| 成人黄色大片在线免费观看| 欧美日韩中文字幕日韩欧美| 亚洲人精品午夜在线观看| 欧美性猛交xxx| 欧美视频免费在线观看| 777国产偷窥盗摄精品视频| 久热国产精品视频| 欧美一区二粉嫩精品国产一线天| 日韩视频在线观看免费| 成人做爰www免费看视频网站| 永久免费精品影视网站| 日本a级片电影一区二区| 色婷婷综合久久久久中文字幕1| 国产在线精品自拍| 亚洲女人初尝黑人巨大| 欧美在线性爱视频| 亚洲精品国精品久久99热| 国产亚洲综合久久| 成人av在线天堂| 亚洲视频在线观看免费| 精品国产91乱高清在线观看| 欧美专区在线播放| 97人洗澡人人免费公开视频碰碰碰| 久久精品视频一| 久久五月天综合| 欧美性猛交xxxx黑人猛交| 日韩av在线免费| 亚洲在线视频福利| 久久天堂电影网| 国产精品视频最多的网站| 亚洲a∨日韩av高清在线观看| 日韩在线激情视频| 国产精品美女久久久久久免费| 亚洲精品永久免费精品| 亚洲第一国产精品| 国产精品扒开腿爽爽爽视频| 国产欧美在线播放| 日韩av在线高清| 久久久91精品国产| 亚洲奶大毛多的老太婆| 国产热re99久久6国产精品| 国产日韩在线观看av| 国产一区二区丝袜| 日韩精品在线看| 精品国产精品三级精品av网址| 精品久久久久久| 亚洲成人亚洲激情| 美女扒开尿口让男人操亚洲视频网站| 亚州国产精品久久久| 亚洲精品中文字幕av| 国产精品福利在线| 人九九综合九九宗合| 狠狠躁夜夜躁人人躁婷婷91| 欧美肥臀大乳一区二区免费视频| 国产精品主播视频| 一区二区三区亚洲| 欧美在线视频网| 97色在线观看| 欧美色道久久88综合亚洲精品| 午夜精品一区二区三区av| 最近日韩中文字幕中文| 成人在线观看视频网站| 亚洲精品一区中文字幕乱码| 国产成人精品av在线| 国产精品无av码在线观看| 欧美性猛交99久久久久99按摩| 国产一区二区美女视频| 国产69精品99久久久久久宅男| 国产精品久久久久久搜索| 国产精品久久久久久久久久久久| 亚洲欧美色婷婷| 国产精品亚洲美女av网站| 中文在线资源观看视频网站免费不卡| 欧美黑人xxx| 亚洲第一区第二区| 亚洲aaa激情| 亚洲综合最新在线| 欧美激情亚洲自拍| 国产亚洲精品久久久优势| 国产精欧美一区二区三区| 亚洲嫩模很污视频| 欧美劲爆第一页| 欧美性猛交xxxx免费看漫画| 日本一区二三区好的精华液| 亚洲综合最新在线| 欧美在线亚洲一区| 欧美裸体xxxxx| 久久免费视频网站| 国产精品久久久久久久久久| 国产一区二区三区日韩欧美| 成人做爰www免费看视频网站| 91久久精品国产91久久性色| 欧美精品一本久久男人的天堂| 秋霞成人午夜鲁丝一区二区三区| 日韩中文字幕在线| 欧美大片在线看免费观看| 伊人久久久久久久久久久久久| 国产欧美日韩免费| 久久精品99久久久久久久久| 国产精品99久久久久久久久久久久| 精品视频一区在线视频| 国产精品偷伦视频免费观看国产| 欧美一区二粉嫩精品国产一线天| 成人午夜小视频| 国产国产精品人在线视| 欧美性一区二区三区| 国产精品r级在线| 97视频在线观看视频免费视频| 亚洲xxx大片| 久久精品这里热有精品| 国产精品18久久久久久麻辣| 欧美日韩在线观看视频| 亚洲色图色老头| 亚洲毛片在线免费观看| 午夜精品久久久久久久白皮肤| 亚洲欧美日韩直播| 黄网站色欧美视频| 免费91麻豆精品国产自产在线观看| 国产精品成人av性教育| 日韩国产精品视频| 国产精品精品视频一区二区三区| 97视频免费在线观看| 亚洲欧洲午夜一线一品| 国产午夜精品免费一区二区三区| 欧美整片在线观看| 欧美富婆性猛交| 午夜精品久久久久久久男人的天堂| 欧洲s码亚洲m码精品一区| 亚洲福利视频专区| 欧美极品美女电影一区| 亚洲欧美国产另类| 97久久国产精品| 97超级碰碰碰久久久| 日韩av最新在线| 韩国欧美亚洲国产| 欧美国产日韩一区二区在线观看| 91高潮在线观看| 国产成人免费av电影| 国产91免费观看| 亚洲精品国产精品国自产观看浪潮|