UIScrollView之轮转图片
在iOS开发中,经常会在APP首页看到多张图片进行轮换。刚开始做的时候,感觉很麻烦,不是很好做,查阅资料后,我总结了一下,自己封装了一个简单的轮转图片库;
UIScrollView无限滑动 ,只需要三个View,左视图,中视图,右视图。无论向左滑动,还是向右滑动,都显示中间的一个View;
( _scrollView.contentOffset =CGPointMake(scrollView.bounds.size.width,0); )
// CircleScrollView.h
#import <UIKit/UIKit.h> #import "UIImageView+WebCache.h" // 当使用网络图片的时候,才会用到SDWebImage @protocol CircleScrollViewDelegate <NSObject> @optional /** * 滚动图片总数 * @return 要滚动的图片的个数 */ - (NSInteger) numberOfImagesInScrollView; /** * 返回索引位置的图片,仅当滚动的为图片时使用 * @param index 索引位置 * @return 索引位置的图片 */ -(UIImage *)imageForIndex:(NSInteger) index; /** * 返回索引位置的图片URL,仅当滚动的为图片时使用 * @param index 索引位置 * @return 索引位置对应的图片URL */ -(NSURL *)imageURLForIndex:(NSInteger)index; /** * 选中相应的视图的操作 * @param index 选中的相应的视图 */ - (void)didSelectAtIndex:(NSInteger) index; @end @interface CircleScrollView :UIView <UIScrollViewDelegate> @property (nonatomic,strong,readonly)UIScrollView *scrollView; @property (nonatomic,strong,readonly)UIPageControl *pageControl; @property (nonatomic,strong,readonly)UIImageView *leftView; @property (nonatomic,strong,readonly)UIImageView *middleView; @property (nonatomic,strong,readonly)UIImageView *rightView; @property (nonatomic,assign)int currentPageNo; @property (nonatomic,assign,getter=isAutoLoop)BOOL autoLoop;//是否自动轮动 //@property (nonatomic,copy) NSArray *scrollImgs; @property (nonatomic,weak)id<CircleScrollViewDelegate> delegate;//代理 @end
// CircleScrollView.m
#import "CircleScrollView.h" @interfaceCircleScrollView () { NSTimer *_timer; } @end @implementation CircleScrollView /* 自定义的ScrollView。功能如下: 循环滑动 使用分两步: (1)创建数据源(数据源中存放要滚动的图片) (2)_circleScrollView = [[CircleScrollView alloc] initWithFrame:CGRectMake(20, 20, 128, 128)]; (3)设置代理 _circleScrollView.delegate = self; */ -(instancetype)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame]; if (self) { _scrollView = [[UIScrollViewalloc]initWithFrame:self.bounds]; _scrollView.delegate =self; _scrollView.showsHorizontalScrollIndicator =NO; _pageControl = [[UIPageControlalloc]initWithFrame:CGRectMake(0,self.frame.size.height-10,self.frame.size.width,10)]; _pageControl.backgroundColor = [UIColorlightGrayColor]; _pageControl.pageIndicatorTintColor = [UIColorredColor]; _pageControl.currentPageIndicatorTintColor = [UIColorblueColor]; _pageControl.alpha =0.5; _leftView = [[UIImageViewalloc]initWithFrame:CGRectMake(self.frame.size.width*0,0,self.frame.size.width,self.frame.size.height)]; _middleView = [[UIImageViewalloc]initWithFrame:CGRectMake(self.frame.size.width*1,0,self.frame.size.width,self.frame.size.height)]; _rightView = [[UIImageViewalloc]initWithFrame:CGRectMake(self.frame.size.width*2,0,self.frame.size.width,self.frame.size.height)]; [_scrollViewaddSubview:_leftView]; [_scrollViewaddSubview:_middleView]; [_scrollViewaddSubview:_rightView]; _scrollView.pagingEnabled =YES; _scrollView.contentSize =CGSizeMake(self.frame.size.width*3,self.frame.size.height); _scrollView.contentOffset =CGPointMake(self.frame.size.width,0); [selfaddSubview:_scrollView]; [selfaddSubview:_pageControl]; } returnself; } -(void)setDelegate:(id<CircleScrollViewDelegate>)delegate { // NSLog(@"设置代理"); _delegate = delegate; if ([_delegaterespondsToSelector:@selector(numberOfImagesInScrollView)]) { NSInteger number = [_delegatenumberOfImagesInScrollView]; _pageControl.numberOfPages = number; _pageControl.currentPage =0; _currentPageNo =0; // _leftView.image = [_delegate imageForIndex:number-1]; // _middleView.image = [_delegate imageForIndex:_currentPageNo]; int nextNo =_currentPageNo; if (number >2) { nextNo = _currentPageNo+1; } // _rightView.image = [_delegate imageForIndex:nextNo]; if ([self.delegaterespondsToSelector:@selector(imageURLForIndex:)]) { [_leftViewsd_setImageWithURL:[_delegateimageURLForIndex:number-1]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { // NSLog(@""); }]; [_middleViewsd_setImageWithURL:[_delegateimageURLForIndex:_currentPageNo]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { }]; [_rightViewsd_setImageWithURL:[_delegateimageURLForIndex:nextNo]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { }]; } elseif ([self.delegaterespondsToSelector:@selector(imageForIndex:)]){ _leftView.image = [_delegateimageForIndex:number-1]; _middleView.image = [_delegateimageForIndex:_currentPageNo]; _rightView.image = [_delegateimageForIndex:nextNo]; } } if ([_delegaterespondsToSelector:@selector(didSelectAtIndex:)]) { _middleView.userInteractionEnabled =YES; UITapGestureRecognizer *tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(selectAction:)]; [_middleViewaddGestureRecognizer:tap]; } } -(void)selectAction:(UITapGestureRecognizer *)gesture { if ([self.delegaterespondsToSelector:@selector(didSelectAtIndex:)]) { [self.delegatedidSelectAtIndex:_currentPageNo]; } } -(void)autoLoop{ _currentPageNo++; //自动循环 [_scrollViewscrollRectToVisible:CGRectMake(_scrollView.bounds.size.width*2,0,_scrollView.bounds.size.width,_scrollView.bounds.size.height)animated:YES]; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ // NSLog(@"scrollViewDidEndDecelerating"); int pageNo = scrollView.contentOffset.x/scrollView.bounds.size.width; long imgCount = [_delegatenumberOfImagesInScrollView]; // NSLog(@"pageNo : %i",pageNo); if (pageNo ==0) { _currentPageNo--; } elseif (pageNo ==2){ _currentPageNo++; } if (_currentPageNo <0) { _currentPageNo = (int)(imgCount -1); } elseif (_currentPageNo > imgCount -1) { _currentPageNo =0; } int previousPage =_currentPageNo -1; if (previousPage <0) { previousPage = (int)(imgCount -1); } int nextPage =_currentPageNo +1; if (nextPage > imgCount-1) { nextPage = 0; } _pageControl.currentPage =_currentPageNo; if ([self.delegaterespondsToSelector:@selector(imageURLForIndex:)]) { [_leftViewsd_setImageWithURL:[_delegateimageURLForIndex:previousPage]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { }]; [_middleViewsd_setImageWithURL:[_delegateimageURLForIndex:_currentPageNo]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { }]; [_rightViewsd_setImageWithURL:[_delegateimageURLForIndex:nextPage]placeholderImage:[UIImagenew]completed:^(UIImage *image,NSError *error,SDImageCacheType cacheType,NSURL *imageURL) { }]; } elseif ([self.delegaterespondsToSelector:@selector(imageForIndex:)]){ _leftView.image = [_delegateimageForIndex:previousPage]; _middleView.image = [_delegateimageForIndex:_currentPageNo]; _rightView.image = [_delegateimageForIndex:nextPage]; } _scrollView.contentOffset =CGPointMake(scrollView.bounds.size.width,0); } @end
关于自动循环,我们可以自定义,其实就是加一个NSTimer定时器,每过一定的时间让scrollView滑向下一个View,即:
[_scrollViewscrollRectToVisible:CGRectMake(_scrollView.bounds.size.width*2,0,_scrollView.bounds.size.width,_scrollView.bounds.size.height)animated:YES];
scrollView会自动的滑向第三个View。然后图片就可以自动定时滑动了。 使用上述自定义的轮转图片时,一定要遵守UIScrollViewDelegate协议并实现代理方法,否则不可用。
UIScrollView之轮转图片的更多相关文章
- 常错-UIScrollView中得图片不能被拖动
经常在开发中,发现自己UIScrollView里面的图片不能被拖动 在这里做个备忘,第一种可能是contentSize没有设置,第二种可能是contentSize设置的太小了. 测试后发现,与user ...
- iOS下uiview和uiscrollview设置背景图片的源码
1.uiscrollview 设置背景图片 // Setup the Scroll ViewUIScrollView*tempScrollView=(UIScrollView*)self.view;t ...
- UIScrollView浏览一组图片,且图片与图片之间有间隔
---恢复内容开始--- UIScrollView是可以浏览一组view的,只要将其属性 pagingEnabled设置为true就可以了.具体过程是这样的, 1:将一组图片按照从左到右的顺序添加到U ...
- 【iOS开发-54】案例学习:通过UIScrollView的缩放图片功能练习代理模式的详细实现
案例:(在模拟器中按住option键,点击鼠标就会出现缩放的手势) (1)在ViewController.m中: --缩放东西是UIScrollView除了滚动之外的还有一个功能,所以须要缩放的东西应 ...
- UIScrollView做循环图片
#import "ViewController.h" #define IMAGE_COUNT 6 @interface ViewController () { UIImageVie ...
- iOS:UIScrollView控件和UIPageControl控件的详解
UIScrollView滚动视图控件和UIPageControl分页视图控件: UIScrollView用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,当然UIPagecon ...
- iOS开发——UI基础-UIScrollView
一.UIScrollView使用的步骤 1.创建UIScrollView 2.将需要展示的内容添加到UIScrollView中 3.设置UIScrollView的滚动范围 (contentSize) ...
- iOS开发-UITableView顶部图片下拉放大
关于顶部图片下拉放大,在用户展示的个人中心显示用户个人头像信息,设置UITableView的headerView实现,UITableView继承自UIScrollView,同样的设置UIScrollV ...
- ScrollView图片分页显示-简单
用到的控件: 1>UIScrollView:宽度和图片的宽度一样,因为分页的代码就一句 // 设置分页,这个分页的原理实际上是按照ScrollView的宽进行分页的,这里的图片的宽由于和Scro ...
随机推荐
- 7z制作自解压安装包
像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应 ...
- 代码创建数据库_表--SqlServer数据库
/*1.创建数据库的时候需要设置的基本属性: 数据库名称 逻辑名称 初始大小 文件增长 路径*/ --语法: -- create database 数据库名称 -- on [primary]--创建数 ...
- ASP.NET MVC程序播放H.264视频
在这篇之前,Insus.NET不管是在ASP.NET还是ASP.NET MVC实现很多视频播放,你可以参考这篇链接:http://www.cnblogs.com/insus/category/4650 ...
- [水煮 ReSharper] 高效开发—十个实用的快捷键
所有 ReSherper 的功能都可以使用快捷键.大部分功能都有默认快捷键,剩下的少数功能可以自定义快捷键. ReSharper 提供了两种快捷键的方式 Visual Studio:这种方式可以减少与 ...
- iOS阶段学习第14天笔记(NSString与NSMutableString)
iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...
- DCloud与APICloud的对比
DCloud与APICloud这两家目前应该说是市场占有率和人气较高的国内团队:国内还有一些其他的方案如AppCan.exMobi之类的,但可能是商业运作手法上Big不够,近两年的名气不太大,但各自其 ...
- 设置Xshell中支持中文
执行echo $LANG命令输出的是当前的编码方式,执行locale命令得到系统中所有可用的编码方式.要让Xshell不显示乱码,则要将编码方式改为UTF-8. 在Xshell中[file]-> ...
- static的用法
首先,看看变量的存储: int global ; int main() { int stackStore ; int heapStore* = (int *)malloc(sizeof(int)); ...
- python 三级菜单
三级列表: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...
- JavaScript学习(2):对象、集合以及错误处理
在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...