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

首頁 > 系統 > iOS > 正文

iOS實現無限循環滾動的TableView實戰教程

2020-07-26 02:48:18
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了如何實現一個可以無限循環的TableView的相關內容,分享出來供大家參考學習,下面來一起看看詳細的介紹吧。

先來看看效果:


思路

條條大路通羅馬,個人分析下以下思路的可行性:

      1、借鑒無限廣告輪播的思路??尚行圆桓撸饕橇斜眍^部和尾部的銜接不夠自然,而且快速滑動不夠流暢。

      2、使用TableView+3倍長度dataSource。可行性一般,在使用過程中滑動流暢,但是由于重復的數據源,可能導致在處理事件時需要特別對數據進行處理避免重復,另外此方法不能重用,總讓有強迫癥的人感覺不夠優雅。。。

      3、使用TableView子類+數據源攔截器??尚行暂^高,在使用過程中滑動流暢,而且在代理方法中并不需要做特殊處理,可封裝重用。

      4、廣大讀者們提供的更優秀的思路。

實現

我們通過創建TableView的子類,在子類中對dataSource進行處理。

如果直接將子類自身設為子類的dataSource,創建另外一個dataSource作為對外的delegate,將自身不處理的代理消息轉發給對外的delegate,這樣要求自身實現所有的代理方法,非常蛋疼。

因此,我們創建一個攔截器,通過攔截器決定將消息發送到TableView子類內部或者是其dataSource,這樣簡潔又比較優雅(裝逼)。

注:使用此方法實現無限循環的TableView,需要對ObjC的消息轉發有一定理解。

1、創建3倍長度dataSource,并在滑動到頭部或者尾部時進行contentOffset的reset,顯示到中間的位置

- (void)layoutSubviews { [self resetContentOffsetIfNeeded]; [super layoutSubviews];}- (void)resetContentOffsetIfNeeded { CGPoint contentOffset = self.contentOffset; //頭部 if (contentOffset.y < 0.0) {  contentOffset.y = self.contentSize.height / 3.0; } //尾部 else if (contentOffset.y >= (self.contentSize.height - self.bounds.size.height)) {  contentOffset.y = self.contentSize.height / 3.0 - self.bounds.size.height; } [self setContentOffset: contentOffset];}

2、創建一個攔截器

@interface SUTableViewInterceptor : NSObject@property (nonatomic, weak) id receiver;@property (nonatomic, weak) id middleMan;@end

3、將攔截器設置為TableView子類的dataSource

- (void)setDataSource:(id<UITableViewDataSource>)dataSource { self.dataSourceInterceptor.receiver = dataSource; [super setDataSource:(id<UITableViewDataSource>)self.dataSourceInterceptor];}- (SUTableViewInterceptor *)dataSourceInterceptor { if (!_dataSourceInterceptor) {  _dataSourceInterceptor = [[SUTableViewInterceptor alloc]init];  _dataSourceInterceptor.middleMan = self; } return _dataSourceInterceptor;}

4、在子類中實現需要加工處理的代理方法

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { self.actualRows = [self.dataSourceInterceptor.receiver tableView:tableView numberOfRowsInSection:section]; return self.actualRows * 3;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSIndexPath * actualIndexPath = [NSIndexPath indexPathForRow:indexPath.row % self.actualRows inSection:indexPath.section]; return [self.dataSourceInterceptor.receiver tableView:tableView cellForRowAtIndexPath:actualIndexPath];}

5、在攔截器中轉發消息(如果子類實現了代理方法,則轉發給子類;如果子類沒有實現,則轉發給外部的代理)

@implementation SUTableViewInterceptor#pragma mark - forward & response override- (id)forwardingTargetForSelector:(SEL)aSelector { if ([self.middleMan respondsToSelector:aSelector]) return self.middleMan; if ([self.receiver respondsToSelector:aSelector]) return self.receiver; return [super forwardingTargetForSelector:aSelector];}- (BOOL)respondsToSelector:(SEL)aSelector { if ([self.middleMan respondsToSelector:aSelector]) return YES; if ([self.receiver respondsToSelector:aSelector]) return YES; return [super respondsToSelector:aSelector];}@end

到此,自定義的TableView基本完成,整理一下思路,不難理解我們是通過攔截器將代理消息轉發到子類內部,子類內部則通過外部代理提供的dataSource來拷貝成3份,來組成一個3倍于普通長度的TableView,并在其滑動時進行處理,形成可以無限循環滾動的效果。

這樣,在外部看起來,使用這個TableView和普通TableView沒有什么不同,但是多了一個可以循環滾動的“屬性”,當然,你也可以將其封裝成可設置的屬性,方便切換普通模式和循環滾動模式。

下面,用這個TableView的子類來試著創建一個可以循環滾動的列表看看:

- (void)viewDidLoad { [super viewDidLoad]; [self.view addSubview:self.tableView];}- (UITableView *)tableView { if(!_tableView) {  _tableView = [[SUTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];  _tableView.delegate = self;  _tableView.dataSource = self;  _tableView.showsVerticalScrollIndicator = NO;  _tableView.rowHeight = 150.0;  [_tableView registerNib:[UINib nibWithNibName:@"LiveCell" bundle:nil] forCellReuseIdentifier:liveCellID]; } return _tableView;}#pragma mark - UITableViewDataSource- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 5;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { LiveCell * cell = [self.tableView dequeueReusableCellWithIdentifier:liveCellID]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.descLabel.text = [NSString stringWithFormat:@"第 %ld 個主播頻道", indexPath.row + 1]; return cell;}

怎么樣,強迫癥是不是舒緩了,是不是輕松多了~~~

Demo

GitHub地址:SUTableView

本地下載:http://xiazai.VeVB.COm/201705/yuanma/SUTableView(VeVB.COm).rar

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人欧美在线视频| 亚洲色图av在线| 欧美成人精品一区二区三区| 日本欧美一二三区| 热re91久久精品国99热蜜臀| 国产精品观看在线亚洲人成网| 国产精品免费久久久| 日韩免费高清在线观看| 欧美日韩一区二区免费视频| 日韩成人中文电影| 久久av红桃一区二区小说| 欧美体内谢she精2性欧美| **欧美日韩vr在线| 在线观看免费高清视频97| 国外成人在线直播| 国产噜噜噜噜久久久久久久久| 亚洲欧美日韩爽爽影院| 国产成人高清激情视频在线观看| 亚洲男人7777| 亚洲午夜av久久乱码| 大荫蒂欧美视频另类xxxx| 国产精品18久久久久久麻辣| 午夜精品久久久久久久99热| 久久久999国产精品| 日韩va亚洲va欧洲va国产| 亚洲欧美日韩一区在线| 日本精品视频网站| 欧美成人亚洲成人日韩成人| 91精品国产成人www| 91久久久久久久久久久| 97国产精品视频人人做人人爱| 国产日韩欧美视频在线| 一区二区三区四区精品| 欧美一区二区三区免费观看| 欧美性色xo影院| 国产欧美日韩最新| 亚洲精品中文字幕女同| 色老头一区二区三区在线观看| 欧美激情2020午夜免费观看| 久久久精品国产网站| 欧美中文在线观看国产| 亚洲精品91美女久久久久久久| 国产成人精品a视频一区www| 国产精品久久久久久久久免费看| 欧美国产日韩视频| 欧美日韩国产第一页| 亚洲天堂日韩电影| 亚洲人精选亚洲人成在线| 欧美激情va永久在线播放| 久久亚洲综合国产精品99麻豆精品福利| 欧美一级片久久久久久久| 国产精品扒开腿做| 日韩最新中文字幕电影免费看| 色婷婷av一区二区三区久久| 亚洲第一区中文字幕| 91在线播放国产| 亚洲精品国精品久久99热一| 91精品国产91久久久久| 日韩电影中文字幕| 亚洲跨种族黑人xxx| 国产在线播放不卡| 国产精品wwww| 久久伊人精品一区二区三区| 日韩美女写真福利在线观看| 亚洲精选在线观看| 色香阁99久久精品久久久| 日韩成人在线视频观看| 国产精品综合不卡av| 色先锋资源久久综合5566| 亚洲性线免费观看视频成熟| 亚洲在线第一页| 国产精品9999| 91成人免费观看网站| 亚洲乱亚洲乱妇无码| 欧美精品九九久久| 国产精品视频自拍| 91天堂在线视频| 久久琪琪电影院| 欧美—级a级欧美特级ar全黄| 亚洲图片在线综合| 国产在线精品一区免费香蕉| 欧美二区在线播放| 中文字幕精品国产| 欧美巨乳美女视频| 国产盗摄xxxx视频xxx69| 2019中文字幕在线免费观看| 91在线观看免费| 亚洲高清久久久久久| 国产做受高潮69| 日韩视频在线观看免费| 国产欧美精品xxxx另类| 日韩成人中文字幕在线观看| 国产精品视频大全| 日韩精品免费在线视频| 亚洲福利视频网| 日韩在线视频二区| 亚洲xxxx3d| 91久久精品国产91久久性色| 2020国产精品视频| 国产精品久久久久久久9999| 91福利视频网| 国产精品一区二区性色av| 亚洲精品国产精品国自产观看浪潮| 久久久av电影| 国产精品影院在线观看| 亚洲视频在线播放| 国产欧美日韩精品丝袜高跟鞋| 国产一区二区三区在线视频| 国产97在线亚洲| 国产脚交av在线一区二区| 欧美亚州一区二区三区| 成人av电影天堂| 欧美一级电影免费在线观看| 国产精品免费久久久| 国产精品草莓在线免费观看| 97在线视频一区| 精品国产一区二区三区久久久狼| 欧美激情欧美狂野欧美精品| 国产成人+综合亚洲+天堂| 精品国产老师黑色丝袜高跟鞋| 热久久视久久精品18亚洲精品| 国产香蕉97碰碰久久人人| 啊v视频在线一区二区三区| 国产精品永久免费在线| 亚洲性视频网址| 国产在线一区二区三区| 精品无人区太爽高潮在线播放| 国产成人精品久久亚洲高清不卡| 欧美日韩国产区| 亚洲高清免费观看高清完整版| 亚洲少妇激情视频| 91精品国产综合久久香蕉最新版| 欧美性xxxx在线播放| 亚洲精品国产精品久久清纯直播| 亚洲国产私拍精品国模在线观看| 亚洲欧美日本另类| 国产成人精品在线观看| 国产一区二区三区精品久久久| 亚洲精品日韩丝袜精品| 亚洲偷熟乱区亚洲香蕉av| 日韩亚洲精品电影| 亚洲性视频网站| 综合网日日天干夜夜久久| 国产精品入口日韩视频大尺度| 亚洲综合在线小说| 91精品视频在线看| 欧美野外猛男的大粗鳮| 国产女精品视频网站免费| 91av在线视频观看| 日韩精品在线免费观看| 国产精品三级久久久久久电影| 国产精品一区二区在线| 亚洲欧美第一页| 一区二区在线视频| 日韩一区二区三区国产| 成人激情综合网| 亚洲国产精品国自产拍av秋霞| 亚洲成人aaa| 日韩中文字幕不卡视频| 成人在线中文字幕| 欧美激情视频在线免费观看 欧美视频免费一| 国产丝袜精品第一页| 欧美激情亚洲综合一区| 日韩欧美视频一区二区三区|