// // KWMBannerView.m // iCemarose // // Created by HouWeiBin on 2017/5/31. // Copyright © 2017年 kollway. All rights reserved. // #import "KWMBannerView.h" @implementation KWMBannerView{ iCarousel *carousel; NSTimer *timer; BOOL isFirstLoad; BOOL isScroll; } -(void)addTimer{ [self removeTimer]; isFirstLoad = YES; timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(doTimer) userInfo:nil repeats:YES]; [timer setFireDate:[NSDate distantPast]];//开启 } -(void)removeTimer{ //结束 if([timer isValid]){ [timer invalidate]; timer = nil; } } -(void)doTimer{ NSInteger pageCount = self.delegate?[self.delegate numberOfPagesForBanner:self]:0; if(pageCount > 0 && !isScroll){ if(isFirstLoad){ //避免出现第一次显示就是第二页的情况 isFirstLoad = NO; return; } NSInteger currentIndex = self.pageIndex; currentIndex ++; [carousel scrollToItemAtIndex:currentIndex animated:YES]; [self updateUIOnPageChange]; } } -(instancetype)init{ self = [super init]; if(self){ } return self; } -(id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if(self){ [self initBannerView:frame]; } return self; } -(instancetype)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { [self initBannerView:self.frame]; } return self; } -(void)awakeFromNib{ [super awakeFromNib]; } -(void)setDelegate:(id<KWMBannerViewDelegate>)delegate{ _delegate = delegate; if(delegate){ [self reloadData]; } } -(void)reloadData{ if(carousel){ [carousel reloadData]; } if(self.foregroundView && self.foregroundView.tag == 1002){ KWMPageControl *pageControl = (KWMPageControl *)self.foregroundView; pageControl.numberOfPages = [self numberOfItemsInCarousel:carousel]; //pageControl圆点右对齐 NSInteger count = self.delegate?[self.delegate numberOfPagesForBanner:self]:0; CGSize pageControlSize = [pageControl sizeForNumberOfPages:count]; CGFloat paddingLeft = (pageControl.bounds.size.width - pageControlSize.width) / 2 - 15; [pageControl setBounds:CGRectMake(-paddingLeft, pageControl.bounds.origin.y, pageControl.bounds.size.width, pageControl.bounds.size.height)]; } } -(void)initBannerView:(CGRect)frame{ carousel = [[iCarousel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; carousel.delegate = self; carousel.dataSource = self; carousel.decelerationRate = 0.5; carousel.type = iCarouselTypeLinear; carousel.clipsToBounds = YES; [self addSubview:carousel]; UIImageView *noDataImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; noDataImageView.contentMode = UIViewContentModeCenter; UIImage *noDataImage = [UIImage imageNamed:@"ic_logo"]; noDataImageView.image = noDataImage; noDataImageView.tag = 1001;//用于判断是否默认背景view self.backgroundView = noDataImageView; CGRect pageControlFrame = CGRectMake(0, frame.size.height - 20, frame.size.width, 20); UIImage *defaultImage = [UIImage imageNamed:@"ic_page_1"]; UIImage *currentImage = [UIImage imageNamed:@"ic_page_2"]; KWMPageControl *pageControl = [[KWMPageControl alloc]initWithFrame:pageControlFrame currentImage:currentImage andDefaultImage:defaultImage]; pageControl.numberOfPages = 4; pageControl.currentPage = 0; pageControl.tag = 1002;//用于判断是否默认前景view self.foregroundView = pageControl; } -(NSInteger)pageIndex{ if(carousel){ return carousel.currentItemIndex; } return 0; } -(void)setBackgroundView:(UIView *)backgroundView{ _backgroundView = backgroundView; UIView *oldBackgroundView = [self viewWithTag:101]; if(oldBackgroundView){ [oldBackgroundView removeFromSuperview]; } oldBackgroundView = [self viewWithTag:1001]; if(oldBackgroundView){ [oldBackgroundView removeFromSuperview]; } if(backgroundView){ backgroundView.tag = 101; [self addSubview:backgroundView]; [self sendSubviewToBack:backgroundView]; } } -(void)setForegroundView:(UIView *)foregroundView{ _foregroundView = foregroundView; UIView *oldForegroundView = [self viewWithTag:102]; if(oldForegroundView){ [oldForegroundView removeFromSuperview]; } oldForegroundView = [self viewWithTag:1002]; if(oldForegroundView){ [oldForegroundView removeFromSuperview]; } if(foregroundView){ //设置tag前先判断是否默认foregroundView,以免覆盖了tag foregroundView.tag = foregroundView.tag == 1002?1002:102; [self addSubview:foregroundView]; [self bringSubviewToFront:foregroundView]; } } -(void)updateUIOnPageChange{ if(self.foregroundView && self.foregroundView.tag == 1002){ KWMPageControl *pageControl = (KWMPageControl *)self.foregroundView; pageControl.currentPage = self.pageIndex; } if(self.delegate){ if([self.delegate respondsToSelector:@selector(bannerView:onPageIndexChange:)]){ [self.delegate bannerView:self onPageIndexChange:self.pageIndex]; } if([self.delegate respondsToSelector:@selector(bannerView:backgroundView:updateBackgroundViewAtIndex:)] && self.backgroundView){ [self.delegate bannerView:self backgroundView:self.backgroundView updateBackgroundViewAtIndex:self.pageIndex]; } if([self.delegate respondsToSelector:@selector(bannerView:foregroundView:updateForegroundViewAtIndex:)] && self.foregroundView){ [self.delegate bannerView:self foregroundView:self.backgroundView updateForegroundViewAtIndex:self.pageIndex]; } } } #pragma mark iCarousel methods - (NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel { if(self.delegate){ return [self.delegate numberOfPagesForBanner:self]; } return 0; } - (NSUInteger)numberOfVisibleItemsInCarousel:(iCarousel *)carousel { return 3; } - (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view{ if(self.delegate){ return [self.delegate bannerView:self reusingView:view pageAtIndex:index]; } return nil; } -(void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index{ if(self.delegate){ [self.delegate bannerView:self onClickPage:index]; } } - (void)carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate{ [self updateUIOnPageChange]; } - (void)carouselDidEndDecelerating:(iCarousel *)carousel{ [self updateUIOnPageChange]; } - (CGFloat)carouselItemWidth:(iCarousel *)carousel { return self.frame.size.width; } -(void)carouselDidEndScrollingAnimation:(iCarousel *)carousel{ isScroll = NO; } -(void)carouselDidScroll:(iCarousel *)carousel{ isScroll = YES; } - (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value { switch (option) { case iCarouselOptionWrap: { return YES; } default: { return value; } } } @end