iOS 自定义图片轮播器类。
2015-12-22 13:59
471 查看
很多app都有图片轮播器,功能基本都一样,把他单独抽取出来做一个类,以后自己用方便。
Demo下载地址:点击打开链接
// XBScrollPlay.h // 图片轮播器 // Created by 王国栋 on 15/12/20. // Copyright © 2015年 xiaobai. All rights reserved. // #import <UIKit/UIKit.h> @class XBScrollPlay; /** * 实现功能:根据设置的图片自动滚动,默认0.5秒。滚动到左右两端自动回滚。手动滚动时定时器不启动,停止时继续自动 滚动。 */ @protocol XBScrollPlayItmeSelectDelegate <NSObject> @optional -(void)scrollPlayItmeSelected:(NSInteger)index; @end @interface XBScrollPlay : UIView @property (nonatomic,weak) id<XBScrollPlayItmeSelectDelegate> delegate; /** * 滚动的图片 */ @property (nonatomic,strong) NSMutableArray* pics; /** * 滚动时间间隔 */ @property (nonatomic,assign) CGFloat interval; /** * 开始滚动 */ -(void)startScroll; /** * 停止滚动 */ -(void)endScroll; @end
// // XBScrollPlay.m // 我的乐校 // // Created by 小白 on 15/12/20. // Copyright © 2015年 xiaobai. All rights reserved. // #import "XBScrollPlay.h" #import <UIKit/UIKit.h> @interface XBScrollPlay ()<UIScrollViewDelegate> @property (nonatomic,strong) UIScrollView* scrollView;//滚动视图; @property (nonatomic,strong) UIPageControl* pageCtrl;//滚动视图 @property (nonatomic,strong) NSMutableArray* scrollArr; @property (nonatomic,strong) NSTimer* timer; @end @implementation XBScrollPlay - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.interval=0.5; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init]; [tap addTarget:self action:@selector(click)]; tap.numberOfTapsRequired=1; [self addGestureRecognizer:tap]; } return self; } -(void) click { if ([self.delegate respondsToSelector:@selector(scrollPlayItmeSelected:)]) { [self.delegate scrollPlayItmeSelected:self.pageCtrl.currentPage]; } } /** 重写Pics的set方法 */ - (void)setPics:(NSMutableArray *)pics { _pics = [NSMutableArray arrayWithArray:pics]; [_pics insertObject:[pics lastObject] atIndex:0]; [_pics addObject:pics[0]]; //1.添加scrollView self.scrollView = [[UIScrollView alloc]init]; self.scrollView.frame =self.bounds; self.scrollView.delegate=self; self.scrollView.showsHorizontalScrollIndicator=NO; self.scrollView.pagingEnabled=YES; for (int i=0; i<self.pics.count; i++) { UIImageView * imaV = [[UIImageView alloc]initWithFrame:CGRectMake(i*self.frame.size.width, 0, self.frame.size.width,self.frame.size.height)]; imaV.tag=i+1; imaV.contentMode=UIViewContentModeScaleToFill; imaV.image =(UIImage*)self.pics[i]; [self.scrollView addSubview:imaV]; } self.scrollView.contentSize =CGSizeMake(self.frame.size.width*_pics.count, 0) ; [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0)]; [self addSubview:self.scrollView]; //2.添加pageControl CGFloat pW = 50; CGFloat pH = 30; CGFloat pX = (self.frame.size.width-pW)/2; CGFloat pY = (self.frame.size.height-pH); self.pageCtrl = [[UIPageControl alloc]initWithFrame:CGRectMake(pX,pY,pW,pH)]; self.pageCtrl.numberOfPages=self.pics.count-2; self.pageCtrl.currentPage=0; self.pageCtrl.pageIndicatorTintColor=[UIColor blueColor]; self.pageCtrl.currentPageIndicatorTintColor=[UIColor redColor]; [self addSubview:self.pageCtrl]; } - (void)startScroll { if (self.timer == nil && self.pics.count>1) { self.timer = [NSTimer scheduledTimerWithTimeInterval:self.interval target:self selector:@selector(scrollPic) userInfo:nil repeats:YES]; // 获取当前的消息循环对象 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // 改变self.timer对象的优先级 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; } } - (void)scrollPic { NSInteger page = self.pageCtrl.currentPage; CGFloat offsetX ; if (page == self.pics.count - 3) { page = 0; } else{ page++; } offsetX = (1+page)*self.scrollView.frame.size.width; [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES]; } -(void)endScroll; { [self.timer invalidate]; self.timer=nil; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 如何计算当前滚动到了第几页? // 1. 获取滚动的x方向的偏移值 CGFloat offsetX = scrollView.contentOffset.x; // 用已经偏移了得值, 加上半页的宽度 offsetX = offsetX + (scrollView.frame.size.width * 0.5); // 2. 用x方向的偏移的值除以一张图片的宽度(每一页的宽度),取商就是当前滚动到了第几页(索引) int page = offsetX / scrollView.frame.size.width; // 3. 将页码设置给UIPageControl if (page == self.pics.count-1) { self.pageCtrl.currentPage = 0; [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width, 0)]; } else if(page ==0) { self.pageCtrl.currentPage = self.pics.count-3; [scrollView setContentOffset:CGPointMake(scrollView.frame.size.width*(self.pageCtrl.currentPage+1), 0)]; } else { self.pageCtrl.currentPage=page-1; } } // 实现即将开始拖拽的时候就停止定时器 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self endScroll]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [self startScroll]; } @end
Demo下载地址:点击打开链接
相关文章推荐
- 个人常用iOS第三方库以及XCode插件介绍
- iOS 数据存储的几种方式
- iOS 支付宝支付主要代码
- iOS如何发布应用 - 2. iOS 开发者申请账号, certificate, provisionining
- VisioStudio中常用快捷键 适用于VS2010
- iOS9输入网址不显示内容
- PopupWindow实现仿iOS QQ音乐上拉菜单栏(支持手势以及点击操作)
- PopupWindow实现仿iOS QQ音乐上拉菜单栏(支持手势以及点击操作)
- iOS 静态库开发
- 关于iOS中的type encodings 和method encodings
- 通讯录的获取
- iOS 中正则表达式的一些语法应用
- iOS8推出了几个新的“controller”
- iOS开发之设计模式(二)
- ios tableview section标题不滑动问题
- (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍
- (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍
- (NO.00005)iOS实现炸弹人游戏(二):素材选择的取舍
- iOS开发之设计模式(一)
- ios runtime 动态注册一个新类 增加一个方法