iOS轮播图(OC版本)

轮播图在开发中经常用到。并且面试的时候也经常回问道。
其实最长问道的也就两点
1、内存优化
2、计时器问题
3、轮播实现方案

                             此轮播图以UIScrollView实现

先以第一点内存优化和实现方案来讲,如何去做内存优化?
图片在iOS设备中很占内存,所以每当遇到加载图片的时候需要格外注意,不要去加载一些不必要的图片。
首先应当想到要减少UIImageView在UIScrollView上加载。结合UITableView的特点:复用。所以至少应当创建三个UIImageView。


要以这种方式排列

实际上我们所展示的第1张图片在对应的ScrollView上应该是第2页。
并且重要的一点就是:所展示的图片一直是中间的。当滑到两边的图片后,要立刻重置到第二张。

两种代理实现方案

减速实现

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 

滑动过程中

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView

当使用结束拖拽的代理正常使用情况下其实是不会出现的问题的,但是当用户快速拖拽时,scrollview的偏移会出现问题。最好的方法便是实时计算偏移量

核心代码

        - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  {
      [self reloadIndex];
  }



  //滑到中心,切记不能调用该动画,否则会触发代理
- (void)scrollCenter
{
      [self.mainScrollView setContentOffset:CGPointMake(CGRectGetWidth(self.mainScrollView.bounds), 0)];
      if (self.indexBack) {
          self.indexBack(self.index);
      }
  }



  //计算页数
    - (void)reloadIndex
  {
      if (self.imageArray && self.imageArray.count > 0)
      {
          CGFloat pointX = self.mainScrollView.contentOffset.x;

          //此处的value用于边缘判断,当imageview距离两边间距小于1时,触发偏移
          CGFloat Value = 0.2f;

          if (pointX > 2 * CGRectGetWidth(self.mainScrollView.bounds) - Value) {
              self.index = (self.index + 1) % self.imageArray.count;
        
    } else if (pointX < Value) {
        self.index = (self.index + self.imageArray.count - 1) % self.imageArray.count;
    }

}

  }

  //重写index的set方法
  - (void)setIndex:(NSInteger)index
  {
      _index = index;
      NSInteger totalCount = self.imageArray.count;
      NSInteger   leftIndex = (self.index+totalCount-1)%totalCount;
      NSInteger   rightIndex = (self.index+1)%totalCount;

      [self.leftImageView setImage:[UIImage imageNamed:self.imageArray[leftIndex]]];
      [self.midImageView setImage:[UIImage imageNamed:self.imageArray[self.index]]];
      [self.rightImageView setImage:[UIImage imageNamed:self.imageArray[rightIndex]]];

      [self scrollCenter];
  }

关于计算页数说明:
假如有4张图片排序为,4|0|1|2|3,其实严格说此排序像一个环形数列,所以leftIndex和rightIndex的公式相当于去计算指定页数的前一个和后一个数字

  .h 文件
      @interface MCScrollView : UIView


  @property (nonatomic, copy) void(^indexBack)(NSInteger pageIndex);      //页数回调

  @property (nonatomic, copy) NSArray *imageArray;    //存储图片数据

  @property (nonatomic, assign) NSInteger index;      //当前第几页,默认为0(0为第一页,如果制定页数需要加1)

  @end

定时器添加

  .h文件添加
  @property (nonatomic, assign) NSTimeInterval    duration;       //时长

实现

   - (void)setDuration:(NSTimeInterval)duration
    {
        _duration = duration;
      if (duration > 0.0) {
    
          self.timer = [NSTimer scheduledTimerWithTimeInterval:duration target:self selector:@selector(changeNext) userInfo:nil repeats:YES];
          [self.timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:duration]];
      }
  }


  - (void)changeNext
  {
      [self.mainScrollView setContentOffset:CGPointMake(2*CGRectGetWidth(self.mainScrollView.bounds), 0) animated:YES];
  }



  - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
  {
      [self.timer setFireDate:[NSDate distantFuture]];
  //[NSDate distantFuture]表示暂停计时
  }



  - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  {
      [self.timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.duration]];
  //
  }

[NSDate dateWithTimeIntervalSinceNow:self.duration]表示在当前时间的几秒后开始计时,优点是不会立即执行计时器
Demo地址:https://github.com/HeartbeatT/MCScrollView.git

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 许是寒天的蛛丝 爬满朔风腹地 经不住暖阳 哀嚎一片升起 密匝匝的刷子 执拗的固守山岳的头皮 群岚对卧 笑出满顶涟漪...
    一舟洲阅读 239评论 0 1
  • 或许某天 翻开日记 我会突然想起现在的自己 会讨厌这样的自己 但我希望 你知道 我会受伤 我从来都知道 世界是彩色...
    Gelnd阅读 103评论 0 1
  • 很多时候非常迷茫。 有时候自己心里有一切迷茫的答案,可是,却不知道从哪下手。 对于一个中国女人,最终的归宿是回归家...
    菜菜的星辰大海阅读 429评论 0 2
  • 夏季是阳气最盛的季节,气候炎热而生机旺盛。此时是新陈代谢的时期,阳气外发,伏阴在内,气血运行亦相应地旺盛起来,活跃...
    ssggou阅读 132评论 0 1