iOS实现无限循环滚动的TableView实战教程

  

  

本文主要给大家介绍了如何实现一个可以无限循环的表视图的相关内容,分享出来供大家参考学习、下面来一起看看详细的介绍吧。
  

  

<强>先来看看效果:

  

 iOS实现无限循环滚动的TableView实战教程”> <br/>
  </p>
  <p> </p>
  <p> <>强条条大路通罗马,个人分析下以下思路的可行性:</强> </p>
  <p>,,,,,1、借鉴无限广告轮播的思路。可行性不高,主要是列表头部和尾部的衔接不够自然,而且快速滑动不够流畅。</p>
  <p>,,,,,2、使用TableView + 3倍长度数据源。可行性一般,在使用过程中滑动流畅,但是由于重复的数据源,可能导致在处理事件时需要特别对数据进行处理避免重复,另外此方法不能重用,总让有强迫症的人感觉不够优雅…</p>
  <p>,,,,,3、使用TableView子类+数据源拦截器。可行性较高,在使用过程中滑动流畅,而且在代理方法中并不需要做特殊处理,可封装重用。</p>
  <p>,,,,,4、广大读者们提供的更优秀的思路。</p>
  <p> </p>
  <p>我们通过创建表视图的子类,在子类中对数据源进行处理。</p>
  <p>如果直接将子类自身设为子类的数据源,创建另外一个数据源作为对外的委托,将自身不处理的代理消息转发给对外的委托,这样要求自身实现所有的代理方法,非常蛋疼。<br/>
  </p>
  <p>因此,我们创建一个拦截器,通过拦截器决定将消息发送到TableView子类内部或者是其数据源,这样简洁又比较优雅(装逼)。<br/>
  </p>
  <p>使用此方法实现无限循环的表视图,需要对ObjC的消息转发有一定理解。</p>
  <p> <强> 1,创建3倍长度数据源,并在滑动到头部或者尾部时进行内容偏移的重置,显示到中间的位置</强> </p>
  
  <pre类=   - (void) layoutSubviews {   (自我resetContentOffsetIfNeeded);   (超级layoutSubviews);   }      - (void) resetContentOffsetIfNeeded {   CGPoint内容偏移=self.contentOffset;//头部   如果(内容偏移。y & lt;0.0){   内容偏移。y=self.contentSize。高度/3.0;   }//尾部   else if(内容偏移。y祝辞=(self.contentSize。身高- self.bounds.size.height)) {   内容偏移。y=self.contentSize。高度/3.0 - self.bounds.size.height;   }   (自我setContentOffset:内容偏移);   }      

<强> 2,创建一个拦截器

        @ interface SUTableViewInterceptor: NSObject      @ property(原子、弱)id接收机;   @ property(原子、弱)id中间人;      @end      

<强> 3,将拦截器设置为TableView子类的数据源

        - (void) setDataSource:数据源(id      

<强> 4,在子类中实现需要加工处理的代理方法

        ——(NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection:也(NSInteger)节{   自我。(self.dataSourceInterceptor actualRows==邮栈鷗ableView: tableView numberOfRowsInSection:也部分);   回归自我。actualRows * 3;   }      ——(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {   NSIndexPath * actualIndexPath=[NSIndexPath indexPathForRow: indexPath。行%的自我。actualRows切口:indexPath.section];   [self.dataSourceInterceptor返回。接收机tableView: tableView cellForRowAtIndexPath actualIndexPath):;   }      

<强> 5,在拦截器中转发消息(如果子类实现了代理方法,则转发给子类,如果子类没有实现,则转发给外部的代理)

        @ implementation SUTableViewInterceptor      # pragma马克-向前,响应覆盖   - (id) forwardingTargetForSelector (SEL): aSelector {   如果([自我。中间人respondstoselectorismemberofclass: aSelector])返回self.middleMan;   如果([自我。接收机respondstoselectorismemberofclass: aSelector])返回self.receiver;   返回(超级forwardingTargetForSelector: aSelector);   }      - (BOOL) respondstoselectorismemberofclass: (SEL) aSelector {   如果([自我。中间人respondstoselectorismemberofclass: aSelector])返回YES;   如果([自我。接收机respondstoselectorismemberofclass: aSelector])返回YES;   返回(超级respondstoselectorismemberofclass: aSelector);   }      @end

iOS实现无限循环滚动的TableView实战教程