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

iOS开发之collectionView实现无限轮播视图

2016-04-09 15:16 671 查看


#import <UIKit/UIKit.h>

static NSString *ID = @"bannerCell";

@class BannerView;
@protocol BannerViewDelegate <NSObject>

@optional
- (void)bannerView:(BannerView *)bannerView didSelectedAtIndex:(NSInteger)nIndex;

@end

@interface BannerView : UIView

@property(nonatomic, strong)NSArray *imageArray;
@property(nonatomic, assign)CGFloat autoScrollTimeInterval;
@property(nonatomic, weak)id<BannerViewDelegate>  delegate;
+ (instancetype)bannerViewWithFrame:(CGRect)frame imageArray:(NSArray *)imageArray;

@end
</span>


.m文件实现

<span style="font-size:12px;">#import "BannerView.h"
#import "BannerViewCell.h"
#import <Masonry/Masonry.h>

@interface BannerView () <UICollectionViewDataSource, UICollectionViewDelegate>
@property(nonatomic, weak)UICollectionView *collectionView;
@property(nonatomic, weak)UICollectionViewFlowLayout *flowLayout;
@property(nonatomic, strong)NSTimer *timer;
@property(nonatomic, assign)NSInteger totalItemsCount;
@property(nonatomic, weak)UIPageControl *pageControl;
@end

@implementation BannerView
+ (instancetype)bannerViewWithFrame:(CGRect)frame imageArray:(NSArray *)imageArray
{
BannerView *bannerView = [[self alloc]initWithFrame:frame];
bannerView.imageArray = imageArray;
return bannerView;
}

- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor orangeColor];
[self SetupSubviews];
}

return self;
}

- (void)SetupSubviews
{
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
flowLayout.itemSize = self.frame.size;
flowLayout.minimumLineSpacing = 0;
flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.flowLayout = flowLayout;

UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:self.frame
collectionViewLayout:flowLayout];

collectionView.pagingEnabled = YES;
collectionView.showsHorizontalScrollIndicator = NO;
collectionView.showsVerticalScrollIndicator = NO;
[collectionView registerClass:[BannerViewCell class] forCellWithReuseIdentifier:ID];
collectionView.dataSource = self;
collectionView.delegate = self;
[self addSubview:collectionView];
self.collectionView = collectionView;

UIPageControl *pageControl = [[UIPageControl alloc] init];
pageControl.currentPageIndicatorTintColor = [UIColor colorWithRed:85/255.0 green:132/255.0 blue:213/255.0 alpha:1.0];
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
[self addSubview:pageControl];
self.pageControl = pageControl;
}

- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
self.flowLayout.itemSize = self.frame.size;
}

- (void)setAutoScrollTimeInterval:(CGFloat)autoScrollTimeInterval
{
_autoScrollTimeInterval = autoScrollTimeInterval;

[_timer invalidate];
_timer = nil;
[self setupTimer];
}

- (void)layoutSubviews
{
[super layoutSubviews];

__weak __typeof(&*self)weakSelf = self;
[self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(weakSelf);
make.bottom.mas_equalTo(weakSelf.mas_bottom);
make.width.mas_equalTo(weakSelf.bounds.size.width/5.0);
}];

_collectionView.frame = self.bounds;
if (_collectionView.contentOffset.x == 0) {
[_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:_totalItemsCount*0.5 inSection:0]
atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
}
}

- (void)setImageArray:(NSArray *)imageArray
{
_imageArray = imageArray;
self.pageControl.numberOfPages = imageArray.count;
_totalItemsCount = imageArray.count*1000;
}

- (void)setupTimer
{
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:self.autoScrollTimeInterval target:self
selector:@selector(automaticScroll) userInfo:nil repeats:YES];
_timer = timer;
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)automaticScroll
{
int currentIndex = _collectionView.contentOffset.x / _flowLayout.itemSize.width;
int targetIndex = currentIndex + 1;
if (targetIndex == _totalItemsCount) {
targetIndex = _totalItemsCount*0.5;
[_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
}
[_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
}

#pragma mark -- UICollectionView DataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return _totalItemsCount;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
BannerViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];

long itemIndex = indexPath.item % self.imageArray.count;
cell.imageView.image = self.imageArray[itemIndex];

return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
long nIndex = indexPath.item%self.imageArray.count;

if ([self.delegate respondsToSelector:@selector(bannerView:didSelectedAtIndex:)]) {
[self.delegate bannerView:self didSelectedAtIndex:nIndex];
}
}

#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
int currentIndex = _collectionView.contentOffset.x / _flowLayout.itemSize.width;
NSInteger page = currentIndex%self.imageArray.count;
self.pageControl.currentPage = page;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[_timer invalidate];
_timer = nil;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[self setupTimer];
}

@end
</span>


自定义cell:

<span style="font-size:12px;">#import <UIKit/UIKit.h>

@interface BannerViewCell : UICollectionViewCell
@property (weak, nonatomic) UIImageView *imageView;
@end</span>


<span style="font-size:12px;">#import "BannerViewCell.h"

@implementation BannerViewCell
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
UIImageView *imageView = [[UIImageView alloc] init];
[self.contentView addSubview:imageView];
_imageView = imageView;
}

return self;
}

- (void)layoutSubviews
{
[super layoutSubviews];

_imageView.frame = self.contentView.frame;
}
@end</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: