您的位置:首页 > 移动开发 > IOS开发

iOS 自定义图片轮播器类。

2015-12-22 13:59 471 查看
很多app都有图片轮播器,功能基本都一样,把他单独抽取出来做一个类,以后自己用方便。

//  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下载地址:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: