無限輪播封裝(代碼主要參考這里)
http://blog.cocoachina.com/article/34641
三張Imageview實(shí)現(xiàn)無限圖片輪播
http://my.oschina.net/iOSliuhui/blog/497070
iOS無限輪播圖片的實(shí)現(xiàn)-僅僅用了三個(gè)UIImageView實(shí)現(xiàn)多圖的輪播效果
http://blog.csdn.net/techfu/article/details/49888999
iOS開發(fā)--輪播圖(無限循環(huán))新玩法--視差輪播--無限循環(huán)的新思路(兩個(gè)UIImageView足矣)
http://blog.csdn.net/wswei99/article/details/50827632
iOS開發(fā)之只用一個(gè)方法實(shí)現(xiàn)圖片的輪播
http://www.imooc.com/article/12806
使用三個(gè)UIImageView實(shí)現(xiàn)多圖的輪播效果
原理很簡單,就是放上3個(gè)UIImageView, 默認(rèn)顯示的是中間的UIImageView,
當(dāng)用戶滑到下一張圖片的臨界點(diǎn)時(shí)候,偷偷的切換回中間的UIImageView展示,但是UIImage卻全部換掉了;也就是說用戶永遠(yuǎn)看到的是中間的UIImageView,只是內(nèi)容不同而已。
1、BannerView.h文件
#import <UIKit/UIKit.h>
/**
* 原理很簡單,就是放上3個(gè)UIImageView, 默認(rèn)顯示的是中間的UIImageView,
* 當(dāng)用戶滑到下一張圖片的臨界點(diǎn)時(shí)候,偷偷的切換回中間的UIImageView展示,但是UIImage卻全部換掉了;
* 也就是說用戶永遠(yuǎn)看到的是中間的UIImageView,只是內(nèi)容不同而已。
*
*/
@class BannerView;
@protocol BannerViewDelegate <NSObject>
- (void) carouselTouch:(BannerView*)carousel atIndex:(NSUInteger)index;
@end
@interface BannerView : UIView
@property (nonatomic, copy) void(^bannerTouchBlock)(NSUInteger index);
@property (nonatomic, weak) id<BannerViewDelegate> delegate;
- (instancetype)initWithFrame:(CGRect)frame;
/**
* 輪播圖url數(shù)組
*
*/
- (void)setupWithArray:(NSArray *)array;
/**
* 本地圖片數(shù)組;
*/
- (void)setupWithLocalArray:(NSArray *)array;
/**
* 類初始化方法;
*
*/
+ (instancetype)initWithFrame:(CGRect)frame
withArray:(NSArray*)array
hasTimer:(BOOL)hastimer
interval:(NSUInteger)inter;
+ (instancetype)initWithFrame:(CGRect)frame
hasTimer:(BOOL)hastimer
interval:(NSUInteger)inter
placeHolder:(UIImage*)image;
@end
2、BannerView.m文件
#import "BannerView.h"
#import <SDWebImage/UIImageView+WebCache.h>
@interface BannerView () <UIScrollViewDelegate>
@property BOOL hasTimer;
@property (nonatomic, assign) NSUInteger interval;
@property (nonatomic, strong) UIImage *placeHolder;
@property (nonatomic, strong) NSArray * imageArray;
@property (nonatomic, strong) UIScrollView *wheelScrollView; // scrollView
@property (nonatomic, strong) UIPageControl *wheelPageControl; // pageControl
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, assign) NSUInteger currentImageIndex;
@property (nonatomic, strong) UIImageView *image1;
@property (nonatomic, strong) UIImageView *image2;
@property (nonatomic, strong) UIImageView *image3;
@property (nonatomic, assign) NSUInteger imageNum;
@property (nonatomic, strong) UIImageView *mask;
@property (nonatomic, assign) BOOL isLocal;
@end
@implementation BannerView
#pragma mark - init
+ (instancetype)initWithFrame:(CGRect)frame
withArray:(NSArray*)array
hasTimer:(BOOL)hastimer
interval:(NSUInteger)inter
{
BannerView * carousel = [[BannerView alloc] initWithFrame:frame];
carousel.hasTimer = hastimer;
carousel.interval = inter;
[carousel setupWithArray:array];
return carousel;
}
+ (instancetype)initWithFrame:(CGRect)frame
hasTimer:(BOOL)hastimer
interval:(NSUInteger)inter
placeHolder:(UIImage*)image
{
BannerView * carousel = [[BannerView alloc] initWithFrame:frame];
carousel.placeHolder = image;
carousel.hasTimer = hastimer;
carousel.interval = inter;
carousel.mask.image = image;
return carousel;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.mask = [[UIImageView alloc] initWithFrame:frame];
[self addSubview:self.wheelScrollView];
[self addSubview:self.wheelPageControl];
[self addSubview:self.mask];
self.wheelScrollView.scrollEnabled = NO;
}
return self;
}
- (void)setupWithArray:(NSArray *)array
{
self.wheelScrollView.scrollEnabled = YES;
self.mask.hidden = YES;
self.imageArray = array;
self.imageNum = self.imageArray.count;
self.currentImageIndex = 0;
if (self.imageNum == 1) {
self.wheelPageControl.hidden = YES;
self.wheelScrollView.scrollEnabled = NO;
}
[self setup];
}
- (void)setupWithLocalArray:(NSArray *)array
{
self.isLocal = YES;
self.wheelScrollView.scrollEnabled = YES;
self.mask.hidden = YES;
self.imageArray = array;
self.imageNum = self.imageArray.count;
self.currentImageIndex = 0;
if (self.imageNum == 1) {
self.wheelPageControl.hidden = YES;
self.wheelScrollView.scrollEnabled = NO;
}
[self setup];
}
/**
* 初始化,啟動(dòng)定時(shí)器;輪播圖片
*/
- (void)setup
{
// 設(shè)置PageControl中心點(diǎn)
self.wheelPageControl.pageIndicatorTintColor = [UIColor whiteColor];
self.wheelPageControl.currentPageIndicatorTintColor = [UIColor blackColor];
CGPoint p = CGPointMake(self.frame.size.width * 0.5, 0.92 * self.frame.size.height);
self.wheelPageControl.center = p;
if (self.hasTimer) {
[self setupTimer];
}
[self updateImage];
}
/**
* 圖片更新
*/
- (void)updateImage
{
self.imageNum = (int)self.imageArray.count;
self.wheelPageControl.numberOfPages = self.imageNum;
[self updateScrollImage];
}
- (void)updateScrollImage
{
int left;
int right;
// 計(jì)算頁數(shù)
int page = self.wheelScrollView.contentOffset.x / self.wheelScrollView.frame.size.width;
if (page == 0)
{
// 計(jì)算當(dāng)前圖片索引
self.currentImageIndex = (self.currentImageIndex + self.imageNum - 1) % self.imageNum; // %限定當(dāng)前索引不越界;
}
else if(page == 2)
{
// 計(jì)算當(dāng)前圖片索引
self.currentImageIndex = (self.currentImageIndex + 1) % self.imageNum;
}
// 當(dāng)前圖片左右索引
left = (int)(self.currentImageIndex + self.imageNum - 1) % self.imageNum;
right = (int)(self.currentImageIndex + 1) % self.imageNum;
// 更換UIImage
if (self.isLocal)
{
self.image1.image = [UIImage imageNamed:self.imageArray[left]];
self.image2.image = [UIImage imageNamed:self.imageArray[self.self.currentImageIndex]];
self.image3.image = [UIImage imageNamed:self.imageArray[right]];
}
else
{
[self.image1 sd_setImageWithURL:[NSURL URLWithString:self.imageArray[left]] placeholderImage:self.placeHolder];
[self.image2 sd_setImageWithURL:[NSURL URLWithString:self.imageArray[self.currentImageIndex]] placeholderImage:self.placeHolder];
[self.image3 sd_setImageWithURL:[NSURL URLWithString:self.imageArray[right]] placeholderImage:self.placeHolder];
}
self.wheelPageControl.currentPage = self.currentImageIndex;
[self.wheelScrollView setContentOffset:CGPointMake(self.wheelScrollView.frame.size.width, 0) animated:NO];
}
#pragma mark - NSTimer
- (void)setupTimer
{
if (self.interval == 0)
{
self.interval = 3;
}
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.interval target:self selector:@selector(updateWheel) userInfo:nil repeats:YES];
// 避免tableview滾動(dòng)時(shí),定時(shí)器停止;
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
- (void)updateWheel
{
CGPoint offset = self.wheelScrollView.contentOffset;
offset.x += self.wheelScrollView.frame.size.width;
[self.wheelScrollView setContentOffset:offset animated:YES];
}
- (void)destroy
{
[self.timer invalidate];
}
#pragma mark - UIScrollView
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
[self updateScrollImage];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self updateScrollImage];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self.timer invalidate];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self setupTimer];
}
- (void)touchAction
{
if ([self.delegate respondsToSelector:@selector(carouselTouch:atIndex:)]) {
[self.delegate carouselTouch:self atIndex:self.currentImageIndex];
}
// 使用block的回調(diào)
if (self.bannerTouchBlock)
{
self.bannerTouchBlock(self.currentImageIndex);
}
}
#pragma mark - Getter
- (UIScrollView *)wheelScrollView
{
if (!_wheelScrollView)
{
_wheelScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
_wheelScrollView.backgroundColor = [UIColor clearColor];
_wheelScrollView.pagingEnabled = YES;
_wheelScrollView.delegate = self;
_wheelScrollView.showsHorizontalScrollIndicator = NO;
_wheelScrollView.showsVerticalScrollIndicator = NO;
// 添加點(diǎn)擊事件
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchAction)];
[_wheelScrollView addGestureRecognizer:tap];
// 使用3個(gè)UIImageView,
_image1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
_image2 = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width, 0, self.frame.size.width, self.frame.size.height)];
_image3 = [[UIImageView alloc] initWithFrame:CGRectMake(2*self.frame.size.width, 0, self.frame.size.width, self.frame.size.height)];
_image2.image = self.placeHolder;
for (UIImageView * img in @[_image1,_image2,_image3]) {
[_wheelScrollView addSubview:img];
}
[_wheelScrollView setContentOffset:CGPointMake(self.frame.size.width, 0) animated:NO];
_wheelScrollView.scrollEnabled = YES;
_wheelScrollView.contentSize = CGSizeMake(3*self.frame.size.width, self.frame.size.height);
}
return _wheelScrollView;
}
- (UIPageControl *)wheelPageControl
{
if (!_wheelPageControl)
{
_wheelPageControl = [[UIPageControl alloc] init];
[_wheelPageControl setBackgroundColor:[UIColor clearColor]];
_wheelPageControl.currentPage = 0;
_wheelPageControl.numberOfPages = self.imageNum;
}
return _wheelPageControl;
}
@end