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 ...
随机推荐
- 【Android】你应该知道的调试神器----adb
最近跟着一个前辈在做TV应用,因为不能通过usb连接调试,接触到了adb,突然间觉得自己似乎发现了另外一个世界,借助adb shell命令对应用进行调试,简直方便得不行.更重要的是,这是命令行操作啊! ...
- OpenJudge 2990:符号三角形 解析报告
2990:符号三角形 总时间限制: 1000ms 内存限制: 65536kB 描述 符号三角形的第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“ ...
- 利用Travis CI 让你的github项目持续构建
Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins,GO的很明显的特别在于采用yaml格式,简洁清新独树一帜.目前大多数的github项目都已经移入到Travis CI的构建队列 ...
- UEditor 1.4.3.1.NET版本上传配置备忘录
UEditor用起来还是挺方便的,下面是记录一下在上传中的配置问题(主要是上传图片的配置,其他的都是类似的). 我下载的是UEditor 1.4.3.1 .NET版本. 官网的配置说明地址为 http ...
- 2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案
一 .工作环境 操作系统:Windows Server 2008 R2 SP1 x64 Apache版本:2.4.4 Subversion版本: Setup-Subversion-1.7.10.msi ...
- WPF学习之绘图和动画
如今的软件市场,竞争已经进入白热化阶段,功能强.运算快.界面友好.Bug少.价格低都已经成为了必备条件.这还不算完,随着计算机的多媒体功能越来越强,软件的界面是否色彩亮丽.是否能通过动画.3D等效果是 ...
- PHP导入excel数据到MYSQL
这里介绍一个直接将excel文件导入mysql的例子.我花了一晚上的时间测试,无论导入简繁体都不会出现乱码,非常好用.PHP-ExcelReader,下载地址: http://sourceforge. ...
- 半连通分量--Tarjan/Kosaraju算法
一个有向图称为半连通(Semi-Connected),满足:对于图中任两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. 若满足,则称G’是G的一个导出子图. 若G’是G的导出子图,且G’半 ...
- C# IDisposable接口
public class MyClass : IDisposable { public int a; public MyClass() { //构造 } public void Dispose() { ...
- jquery表单选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...