欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS实现自动循环播放的banner实例详解

程序员文章站 2023-12-19 16:51:04
前言 对于banner轮播图,相信大家都会经常用到。自动循环播放的banner是很常见的ui组件。如何实现呢?下面就来给大家详细介绍下,话不多说了,下面来一起学习学习吧。...

前言

对于banner轮播图,相信大家都会经常用到。自动循环播放的banner是很常见的ui组件。如何实现呢?下面就来给大家详细介绍下,话不多说了,下面来一起学习学习吧。

1.实现思路

1.横向滚动的banner。

  • uiscrollviw+uiimageview.
  • uicollectionview+uicollectionviewcell.
  • 前者需要自己做重用uiimageview,后者可以直接重用uicollectionviewcell。如果前者没有做重用,多占用内存。

2.自动循环播放banner。

  • 可以使用计时器触发循环播放.
  • 拖动或手动滑动banner时,停止自动循环播放banner。手势停止后,开启自动循环播放banner。

3.特殊banner位的处理。

  • 处于第1个或最后1个时,为保证横向自动滑动效果流畅性,不跳动,需要特殊处理下。
  • 在生成banner时,第1个前面插入最后1个banner。最后1个banner后面插入第1个banner。当滑动到最后1个banner时,重置于第2个banner位。

2.本文采用第二种:uicollectionview+uicollectionviewcell

关键代码实现

2.1生成banner的特殊处理

- (void)setbannerlist:(nsarray<kbanneritem *> *)bannerlist {
 if (bannerlist.count > 1) {
  nsmutablearray *itemlist = [nsmutablearray arraywitharray:bannerlist];
  [itemlist insertobject:bannerlist.lastobject atindex:0];
  [itemlist addobject:bannerlist.firstobject];
  _bannerlist = itemlist;
 }else{
  _bannerlist = bannerlist;
 }
 if (self.bannerlist.count > 1) {
  self.bannerpagecontrol.numberofpages = self.bannerlist.count - 2;
 }else{
  self.bannerpagecontrol.numberofpages = 0;
 }
 self.nobannerimageview.hidden = self.bannerlist.count > 0;
 self.bannerpagecontrol.currentpage = 0;
 [self.collectionview reloaddata];
 self.collectionview.contentoffset = cgpointmake(cgrectgetwidth(self.collectionview.frame), 0);
}

2.2 banner自动循环播放触发的事件

- (void)handlebannerchangeevent:(id)sender {
 if (_bannerpagecontrol.numberofpages <= 1) {
  return;
 }
 nsinteger page = _bannerpagecontrol.currentpage + 1;
 [self.collectionview scrolltoitematindexpath:[nsindexpath indexpathforrow:page + 1 insection:0] atscrollposition:uicollectionviewscrollpositionright animated:yes];
}

2.3开启自动播放或关闭自动播放bannner。

- (void)scrollviewwillbegindragging:(uiscrollview *)scrollview {
 self.counttimer.isopen = no;
}
- (void)scrollviewdidenddragging:(uiscrollview *)scrollview
     willdecelerate:(bool)decelerate {
 self.counttimer.isopen = yes;
}

2.4.滑动时的特殊处理。

- (void)scrollviewdidscroll:(uiscrollview *)scrollview {
 if (_bannerlist.count <=1) {
  return;
 }
 cgfloat width = cgrectgetwidth(scrollview.frame);
 nsinteger currentpage = scrollview.contentoffset.x / width;
 if (currentpage == 0) {
  if (scrollview.contentoffset.x < 0) {
   [self.collectionview scrolltoitematindexpath:[nsindexpath indexpathforrow:_bannerlist.count - 2 insection:0] atscrollposition:uicollectionviewscrollpositionright animated:no];
   self.bannerpagecontrol.currentpage = _bannerlist.count - 2;
  }else{
   [self.collectionview scrolltoitematindexpath:[nsindexpath indexpathforrow:1 insection:0] atscrollposition:uicollectionviewscrollpositionright animated:no];
   self.bannerpagecontrol.currentpage = 0;
  }
 }else if (currentpage == _bannerlist.count - 1) {
  self.bannerpagecontrol.currentpage = 0;
  [self.collectionview scrolltoitematindexpath:[nsindexpath indexpathforrow:1 insection:0] atscrollposition:uicollectionviewscrollpositionright animated:no];
 }else{
  self.bannerpagecontrol.currentpage = currentpage - 1;
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: