227 lines
6.6 KiB
Objective-C
227 lines
6.6 KiB
Objective-C
//
|
||
// LXAdScrollView.m
|
||
// LXAdScrollview
|
||
//
|
||
// Created by imac on 16/11/8.
|
||
// Copyright © 2016年 xiang. All rights reserved.
|
||
//
|
||
|
||
#import "LXAdScrollView.h"
|
||
#import "NSTimer+Addition.h"
|
||
#import "UIImageView+WebCache.h"
|
||
|
||
@interface LXAdScrollView ()<UIScrollViewDelegate>
|
||
|
||
@property (nonatomic, strong) NSTimer *timer;
|
||
@property (nonatomic) CGRect rect;
|
||
@end
|
||
|
||
@implementation LXAdScrollView
|
||
|
||
-(instancetype)initWithFrame:(CGRect)frame
|
||
{
|
||
if (self = [super initWithFrame:frame]) {
|
||
_rect = self.bounds;
|
||
[self creatSubviews];
|
||
}
|
||
return self;
|
||
}
|
||
|
||
-(void)awakeFromNib{
|
||
[super awakeFromNib];
|
||
_rect = CGRectMake(0,0,kScreenSize.width,CGRectGetHeight(self.frame));
|
||
[self creatSubviews];
|
||
}
|
||
|
||
-(void)creatSubviews{
|
||
_animationDuration = 3.0f;
|
||
_leftImageView = [[UIImageView alloc]init];
|
||
[self.scrollView addSubview:_leftImageView];
|
||
|
||
_currentImageView = [[UIImageView alloc]init];
|
||
|
||
[self.scrollView addSubview:_currentImageView];
|
||
|
||
_rightImageView = [[UIImageView alloc]init];
|
||
|
||
[self.scrollView addSubview:_rightImageView];
|
||
_timer = [NSTimer scheduledTimerWithTimeInterval:_animationDuration target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
|
||
[_timer pauseTimer];
|
||
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(onGesture:)];
|
||
[self.scrollView addGestureRecognizer:tapGesture];
|
||
self.translatesAutoresizingMaskIntoConstraints = NO;
|
||
|
||
}
|
||
|
||
-(void)layoutSubviews
|
||
{
|
||
[super layoutSubviews];
|
||
//xib 时 self。frame 改变
|
||
_scrollView.frame = self.bounds;
|
||
_leftImageView.frame = CGRectMake(0,0,CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
|
||
|
||
_currentImageView.frame = CGRectOffset(_leftImageView.frame, CGRectGetWidth(_leftImageView.frame), 0);
|
||
|
||
_rightImageView.frame = CGRectOffset(_currentImageView.frame, CGRectGetWidth(_currentImageView.frame), 0);
|
||
_pageControl.frame = CGRectMake(40, CGRectGetHeight(self.frame)-20, CGRectGetWidth(self.frame)-40*2, 10);
|
||
}
|
||
|
||
#pragma mark - Action
|
||
|
||
-(void)onTimer:(NSTimer*)timer
|
||
{
|
||
[self.scrollView setContentOffset:CGPointMake(CGRectGetWidth(_rect)*2, 0) animated:YES];
|
||
}
|
||
|
||
-(void)onGesture:(UITapGestureRecognizer*)tapGesture
|
||
{
|
||
if (self.tapActionBlock) {
|
||
self.tapActionBlock(self);
|
||
}
|
||
}
|
||
|
||
#pragma mark - setter
|
||
|
||
-(void)setAdList:(NSArray *)adList
|
||
{
|
||
_adList = adList;
|
||
self.pageControl.numberOfPages = _adList.count;
|
||
self.pageControl.currentPage = 0;
|
||
_currentPage = 0;
|
||
|
||
if (_adList.count <= 1) {
|
||
_scrollView.scrollEnabled = NO;
|
||
_scrollView.contentSize = CGSizeMake(CGRectGetWidth(_rect)*3, 0);
|
||
//self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(_rect), 0);
|
||
}else{
|
||
_scrollView.scrollEnabled = YES;
|
||
_scrollView.contentSize = CGSizeMake(CGRectGetWidth(_rect)*3, 0);
|
||
[_timer resumeTimerAfterTimeInterval:_animationDuration];
|
||
}
|
||
[self refreshImageView];
|
||
}
|
||
|
||
//根据当前的index,重置当前显示的图片,并且使currentImageView永远保持在中间
|
||
-(void)refreshImageView
|
||
{
|
||
|
||
NSInteger index = _currentPage;
|
||
[self formatImageView:_currentImageView imageData:self.adList[index]];
|
||
|
||
if (self.adList.count > 1) {
|
||
index = _currentPage-1<0?self.adList.count-1:_currentPage-1;
|
||
[self formatImageView:_leftImageView imageData:self.adList[index]];
|
||
|
||
index = _currentPage+1>=self.adList.count?0:_currentPage+1;
|
||
[self formatImageView:_rightImageView imageData:self.adList[index]];
|
||
}
|
||
|
||
self.scrollView.contentOffset = CGPointMake(CGRectGetWidth(_rect), 0);
|
||
}
|
||
|
||
|
||
-(void)formatImageView:(UIImageView*)imageView imageData:(id)data
|
||
{
|
||
if ([data isKindOfClass:[UIImage class]]) {
|
||
imageView.image = (UIImage*)data;
|
||
}else if ([data isKindOfClass:[NSString class]]) {
|
||
NSString *imageName = (NSString*)data;
|
||
if ([imageName hasPrefix:@"http"]) {
|
||
//网络图片live_upload_banner
|
||
[imageView sd_setImageWithURL:[NSURL URLWithString:imageName] placeholderImage:[UIImage imageNamed:@"live_upload_banner.png"]];
|
||
}else{
|
||
//本地图片
|
||
dispatch_async(dispatch_get_main_queue(), ^{
|
||
|
||
imageView.image = [UIImage imageNamed:imageName];
|
||
});
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
-(void)refreshCurrentPage
|
||
{
|
||
if (self.scrollView.contentOffset.x >= CGRectGetWidth(_rect)*1.5) {
|
||
|
||
_currentPage ++;
|
||
|
||
if (_currentPage > self.adList.count-1) {
|
||
_currentPage = 0;
|
||
}
|
||
}else if (self.scrollView.contentOffset.x <= CGRectGetWidth(_rect)/2) {
|
||
_currentPage--;
|
||
|
||
if (_currentPage < 0) {
|
||
_currentPage = self.adList.count-1;
|
||
}
|
||
}
|
||
}
|
||
|
||
#pragma mark - UI
|
||
-(UIPageControl*)pageControl
|
||
{
|
||
if (!_pageControl) {
|
||
CGRect rect = CGRectMake(40, CGRectGetHeight(_rect)-20, CGRectGetWidth(_rect)-40*2, 10);
|
||
_pageControl = [[UIPageControl alloc]initWithFrame:rect];
|
||
_pageControl.hidesForSinglePage = YES;
|
||
_pageControl.pageIndicatorTintColor = [UIColor grayColor];
|
||
_pageControl.currentPageIndicatorTintColor = RGB(0, 184, 238);
|
||
[self addSubview:_pageControl];
|
||
}
|
||
return _pageControl;
|
||
}
|
||
|
||
-(UIScrollView*)scrollView
|
||
{
|
||
if (!_scrollView) {
|
||
_scrollView = [[UIScrollView alloc]initWithFrame:_rect];
|
||
_scrollView.delegate = self;
|
||
_scrollView.bounces = NO;
|
||
_scrollView.showsHorizontalScrollIndicator = NO;
|
||
_scrollView.showsVerticalScrollIndicator = NO;
|
||
_scrollView.pagingEnabled = YES;
|
||
_scrollView.scrollsToTop = NO;
|
||
_scrollView.contentSize = CGSizeMake(CGRectGetWidth(_rect)*3, 0);
|
||
//_scrollView.backgroundColor = [UIColor redColor];
|
||
[self addSubview:_scrollView];
|
||
}
|
||
return _scrollView;
|
||
}
|
||
|
||
#pragma mark - UIScrollViewDelegate
|
||
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
|
||
{
|
||
//开始滚动时暂停定时器
|
||
[self.timer pauseTimer];
|
||
}
|
||
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
|
||
{
|
||
[self refreshCurrentPage];
|
||
|
||
if (self.pageControl.currentPage != _currentPage) {
|
||
self.pageControl.currentPage = _currentPage;
|
||
[self refreshImageView];
|
||
}
|
||
//滚动结束回复定时器
|
||
[self.timer resumeTimerAfterTimeInterval:_animationDuration];
|
||
}
|
||
|
||
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
|
||
{
|
||
[self refreshCurrentPage];
|
||
|
||
if (self.pageControl.currentPage != _currentPage) {
|
||
self.pageControl.currentPage = _currentPage;
|
||
[self refreshImageView];
|
||
}
|
||
}
|
||
|
||
-(void)dealloc{
|
||
|
||
[_timer invalidate];
|
||
_timer = nil;
|
||
}
|
||
|
||
@end
|