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

来源:互联网 发布:mac pro是什么 编辑:程序博客网 时间:2024/04/29 09:59

#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>






0 0
原创粉丝点击