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 ... 
随机推荐
- SQL--使用NewID函数,创建GUID列
			USE master GO IF EXISTS (SELECT * FROM sysdatabases WHERE name='DB_Temp') DROP DATABASE DB_Temp GO C ... 
- 30天C#基础巩固----查找XML文件元素
			一:XML文档 了解xml文档. 利用代码来创建XML文档. //引用命名空间+using System.Xml; XmlDocument xdoc=new XmlDocument(); XmlDec ... 
- HTML知识点01
			HTML基础知识回顾 1:ie是浏览器的一种,一般的浏览器只是用到了IE的内盒,知识将IE做了个外包. 2:书写HTML时要按照XML标准类书写.有开始就有结束. 3:HTML种属性单双引号都可以,也 ... 
- LINQ的Expression与delegate表达式
			Linq的delegate表达式,Insus.NET觉得它封装得好,让开发时简化了很多代码,而且容易阅读与检索. 比如,我们需要计算优惠给客户金额,打85%折,可以这样写: using System; ... 
- PHP条件语句语法与示例
			一.if…else语句 语法: 1 if(条件){ …… } else{ …… } 2 if(条件){ …… } elseif(条件){ …… } else{ …… } 示例1: <?php & ... 
- 温故而知新--sql存储过程复习
			存储过程是已编译好的T-SQL语句的集合,可以随时调用,速度快,不易出错. 可以传递参数,普通参数和输出参数(output) 实例1 create proc Newpro @testVarA int, ... 
- EntityFramework中几种更改数据的方式
			首先声明个实体类,该实体类是EntityFrameWork自动生成的,对应数据表Test结构如下 public partial class Test { public int Id{ get; set ... 
- 查看SQL Server多实例的版本
			通过 select @@version 查看当前的 SQL Server 安装的版本: 结果返回的是 SQL Server 2008 R2 (SP1),可安装的明明是 SQL Server 2012 ... 
- git Submodule
			http://www.kafeitu.me/git/2012/03/27/git-submodule.html https://git-scm.com/book/zh/v2/Git-%E5%B7%A5 ... 
- NOSQL学习笔记系列之MongoDB  一 基础
			主题:MongoDB 学习资料参考网址: 1.http://www.w3cschool.cc/mongodb/mongodb-tutorial.html 2.http://www.icoolxue.c ... 
