• 简介
  • 分析
  • 实现
  • 代码下载

一、简介

在实际的开发当中,会经常有界面需要实现图片的无限轮播这样的需求。比如新闻app,或者其他app的广告位

实现的方式有很多种,最先想动的一定是scrollView,但是其实scrollView实现起来并没有那么容易。这里,我用了一个较为取巧的办法,使用UICollectionView来实现无限轮播

二、分析

无限轮播,通常就是图片的无限循环的播放。当到最后一个图片的时候,再次轮播时,显示第一个图片。

UICollectionView可以进行上下滚动,也可以进行左右滚动,所有这里我们只需要使用它,并且让它左右滚动即可

我这里将整个内容封装到一个View里面,使用起来较为简单,另外代码中注释也很清晰,这里不做阐述。

三、实现

1⃣️在主控制器中创建广告位

/**
* 加载数据
*/
- (void)loadData
{
NSURL *dataUrl = [[NSBundle mainBundle] URLForResource:@"newses.plist" withExtension:nil];
NSArray *data = [NSArray arrayWithContentsOfURL:dataUrl];
NSMutableArray *tempArray = [NSMutableArray array];
for (NSDictionary *dict in data) {
AdvertModel *advert = [AdvertModel advertModelWithDict:dict];
[tempArray addObject:advert];
}
_advertData = tempArray;
} - (void)createAdvertView
{
CGRect advertRect = CGRectMake(, , , );
AdvertView *advertView = [[AdvertView alloc] initWithFrame:advertRect];
advertView.advertData = _advertData;
[self.view addSubview:advertView];
}

2⃣️广告位的View的实现

#import "AdvertView.h"
#import "AdvertModel.h"
#import "AdvertCell.h" #define cellIdentifier @"advertcell" @interface AdvertView() <UICollectionViewDataSource, UICollectionViewDelegate>
{
UICollectionView *_advertView;
UIPageControl *_pageControl; NSTimer *_timer; NSInteger _width;
NSInteger _height;
}
@end @implementation AdvertView - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//1.设置宽高
_width = frame.size.width;
_height = frame.size.height; //2.创建广告位和PageControl
[self createAdvertView];
[self createPageView]; //3.创建定时器
[self addTimer];
}
return self;
} /**
* 加载数据
*/
- (void)setAdvertData:(NSArray *)advertData
{
_advertData = advertData;
[_advertView reloadData]; [_advertView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem: inSection:] atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
} /**
* 创建广告位
*/
- (void)createAdvertView
{
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.minimumLineSpacing = ;
flowLayout.minimumInteritemSpacing = ;
flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
flowLayout.itemSize = CGSizeMake(_width, _height); CGRect advertRect = CGRectMake(, , _width, _height);
_advertView = [[UICollectionView alloc] initWithFrame:advertRect collectionViewLayout:flowLayout];
[_advertView registerClass:[AdvertCell class] forCellWithReuseIdentifier:cellIdentifier];
_advertView.delegate = self;
_advertView.dataSource = self;
_advertView.pagingEnabled = YES;
_advertView.showsHorizontalScrollIndicator = NO;
_advertView.showsVerticalScrollIndicator = NO;
[self addSubview:_advertView];
} /**
* 创建页码的View
*/
- (void)createPageView
{
UIPageControl *pageControl = [[UIPageControl alloc] init];
pageControl.center = CGPointMake(self.frame.size.width * 0.5, _height - );
pageControl.bounds = CGRectMake(, , , );
pageControl.numberOfPages = ;
pageControl.pageIndicatorTintColor = [UIColor blueColor];
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
[self addSubview:pageControl];
_pageControl = pageControl;
} /**
* 添加定时器
*/
- (void)addTimer
{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextAdvert) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
_timer = timer;
}
/**
* 删除定时器
*/
- (void)removeTimer
{
[_timer invalidate];
_timer = nil;
} /**
* 下一个广告
*/
- (void)nextAdvert
{
CGFloat offset = _advertView.contentOffset.x + _width;
[_advertView setContentOffset:CGPointMake(offset, ) animated:YES];
} #pragma mark - UICollectionView的数据源和代理方法 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return ;
} - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
//这里将数据放足够大,可以无限的轮播循环
return _advertData.count * ;
} - (AdvertCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
AdvertCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.advert = _advertData[indexPath.item % ];
return cell;
} - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
//取出当前可见的单元格
NSIndexPath *visiablePath = [[collectionView indexPathsForVisibleItems] firstObject];
_pageControl.currentPage = visiablePath.item % ;
} #pragma mark 当拖拽时,暂时将定时器销毁
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self removeTimer];
}
#pragma mark 停止拖拽时,再次创建定时器
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self addTimer];
} @end

四、代码下载地址

https://github.com/wangzi9521/InfinitePicture

iOS项目开发之实现无限轮播的更多相关文章

  1. iOS开发UI篇—无限轮播(新闻数据展示)

    iOS开发UI篇—无限轮播(新闻数据展示) 一.实现效果        二.实现步骤 1.前期准备 (1)导入数据转模型的第三方框架MJExtension (2)向项目中添加保存有“新闻”数据的pli ...

  2. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  3. iOS开发UI篇—无限轮播(循环展示)

    iOS开发UI篇—无限轮播(循环展示) 一.简单说明 之前的程序还存在一个问题,那就是不能循环展示,因为plist文件中只有五个数组,因此第一个和最后一个之后就没有了,下面介绍处理这种循环展示问题的小 ...

  4. iOS开发UI篇—无限轮播(功能完善)

    iOS开发UI篇—无限轮播(功能完善) 一.自动滚动 添加并设置一个定时器,每个2.0秒,就跳转到下一条. 获取当前正在展示的位置. [self addNSTimer]; } -(void)addNS ...

  5. iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView

    iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0   ...

  6. iOS:实现图片的无限轮播---之使用第三方库SDCycleScrollView

    SDCycleScrollView API // //  SDCycleScrollView.h //  SDCycleScrollView #import <UIKit/UIKit.h> ...

  7. iOS:实现图片的无限轮播

    为尊重原创,特注明原文链接:http://m.myexception.cn/operating-system/1949043.html 图片轮播及其无限循环效果 平时APP中的广告位或者滚动的新闻图片 ...

  8. iOS:实现图片的无限轮播之使用第三方库SDCycleScrollView

    下载链接:github不断更新地址:https://github.com/gsdios/SDCycleScrollView #import "ViewController.h" # ...

  9. iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)

    这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...

随机推荐

  1. awk 二

    节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y, ...

  2. linux缺页异常处理--用户空间【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7870769 版权声明:本文为博主原创文章,未经博主允许不得转载. 用户空间的缺页异常可以分为两 ...

  3. Java遍历list集合的4种方法

    list集合的遍历4种方法: package com.sort; import java.util.ArrayList; import java.util.Iterator; import java. ...

  4. ffmpeg muxer 参数简要说明

    参数 值 说明 movflags MP4 Muxer 标记 rtphint 增加RTP的hint track empty_moov 初始化空的moov box frag_keyframe 在视频关键帧 ...

  5. git使用教程2-更新github上代码【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/git/ 前言 前面一篇已经实现首次上传代码到github了,迈出了装逼第一步,本篇继续 ...

  6. MSSQL-字符串分离与列记录合并成一行混合使用

    一般我们在数据库的表字段存储字典Id,如果有多个的话一般是用,或分隔符分隔(12,14),列表显示的时候是显示字典名,那如果要在数据库将字典Id转成用户看得懂的字典名,该怎么办呢? 我们这时候可以结合 ...

  7. 请教一下16aspx上的源代码要如何在自己的服务器上运行

    很正常呀,,我下载的也有运行不成功的你要去他们16aspx论坛发帖子问这里很少有人回答你这样的问题

  8. 洛谷 P3955 图书管理员【模拟/思维】

    题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那 ...

  9. 51nod 1420 数袋鼠好有趣【贪心】

    1420 数袋鼠好有趣 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有n只袋鼠.每只袋鼠的大小用一个整数表示. ...

  10. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- Red Rover

    链接:https://www.nowcoder.com/acm/contest/116/A来源:牛客网 输入描述: Input consists of a single line containing ...