<span style="background-color: rgb(102, 255, 255);">// // AdCollectionViewCell.m // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // // // AdCollectionViewCell.h // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // /** * @brief 自定义collectionViewCell,布局每一个广告的现实内容 * @author lijien */ #import <UIKit/UIKit.h> @interface AdCollectionViewCell : UICollectionViewCell // 广告图 @property (nonatomic, strong) UIImageView *adImageView; // 图片描述文字 @property (nonatomic, copy) NSString *titleString; @end #import "AdCollectionViewCell.h" #import "UIView+UIViewExtension.h" @implementation AdCollectionViewCell { UILabel *_titleLabel; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self layoutSubviews]; } return self; } - (void)setTitleString:(NSString *)titleString { _titleString = [titleString copy]; _titleLabel.text = [NSString stringWithFormat:@" %@",titleString]; } - (void)layoutSubviews { self.adImageView = [[UIImageView alloc] initWithFrame:self.bounds]; CGFloat titleW = self.ad_width; CGFloat titleH = self.ad_height; CGFloat titleX = 0; CGFloat titleY = self.ad_height - titleH; _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(titleX, titleY, titleW, titleH)]; _titleLabel.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; _titleLabel.font = [UIFont systemFontOfSize:13]; _titleLabel.textColor = [UIColor whiteColor]; _titleLabel.hidden = !_titleLabel.text; [self addSubview:_adImageView]; [self addSubview:_titleLabel]; } @end // // UIView+UIViewExtension.h // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // #import <UIKit/UIKit.h> /** * @brief 每个广告图frame的坐标和宽高 */ @interface UIView (UIViewExtension) @property (nonatomic, assign) CGFloat ad_X; @property (nonatomic, assign) CGFloat ad_Y; @property (nonatomic, assign) CGFloat ad_width; @property (nonatomic, assign) CGFloat ad_height; @end // // UIView+UIViewExtension.m // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // #import "UIView+UIViewExtension.h" #import "AdScrollViewFrame.h" @implementation UIView (UIViewExtension) - (CGFloat)ad_X { return originX; } - (CGFloat)ad_Y { return originY; } - (CGFloat)ad_width { return adWidth; } - (CGFloat)ad_height { return adHeight; } - (void)setAd_X:(CGFloat)ad_X { CGRect temp = self.frame; temp.origin.x = ad_X; self.frame = temp; } - (void)setAd_Y:(CGFloat)ad_Y { CGRect temp = self.frame; temp.origin.y = ad_Y; self.frame = temp; } - (void)setAd_width:(CGFloat)ad_width { CGRect temp = self.frame; temp.size.width = ad_width; self.frame = temp; } - (void)setAd_height:(CGFloat)ad_height { CGRect temp = self.frame; temp.size.height = ad_height; self.frame = temp; } @end // // AdCycleScrollView.h // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // #import <UIKit/UIKit.h> @class AdCycleScrollView; @protocol AdCycleScrollViewDelegate <NSObject> - (void)cycleScrollView:(AdCycleScrollView *)adScrollView didSelectAtIndex:(NSInteger)index; @end /** * @brief 每一个广告视图的布局 */ @interface AdCycleScrollView : UIView // 图片数据源 @property (nonatomic, strong) NSArray *imageArray; // 标题数据源 @property (nonatomic, strong) NSArray *titleArray; // 时间间隔 @property (nonatomic, assign) CGFloat autoScrollItemTimeInterval; @property (nonatomic, assign) NSInteger currentPageIndex; @property (nonatomic, weak) id<AdCycleScrollViewDelegate>delegate; /** * @brief 外部初始化显示广告图的每个collectionView */ + (instancetype)cycleScrollViewWithFrame:(CGRect)frame imagesGroupArray:(NSArray *)imagesArray titleArray:(NSArray *)titleArray; @end // // AdCycleScrollView.m // LJEAdScrollview // // Created by xiaoyao on 15/4/2. // Copyright (c) 2015年 lijien. All rights reserved. // #import "AdCycleScrollView.h" #import "AdCollectionViewCell.h" #import "UIView+UIViewExtension.h" NSString * const cycleKey = @"cycleKey"; @interface AdCycleScrollView () <UICollectionViewDataSource, UICollectionViewDelegate> { UICollectionView *_mainCollectionView; UICollectionViewFlowLayout *_flowLayout; NSTimer *_timer; NSInteger _totalItemCount; UIPageControl *_pageControl; } @end @implementation AdCycleScrollView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self layoutMainView]; } return self; } + (instancetype)cycleScrollViewWithFrame:(CGRect)frame imagesGroupArray:(NSArray *)imagesArray titleArray:(NSArray *)titleArray { AdCycleScrollView *scroll = [[AdCycleScrollView alloc] initWithFrame:frame]; scroll.imageArray = imagesArray; scroll.titleArray = titleArray; return scroll; } /** * @beief 设置图片collectionView,以及进行线性布局 */ - (void)layoutMainView { // collectionView的布局 _flowLayout = [[UICollectionViewFlowLayout alloc] init]; // 设定全局的cell的frame.size _flowLayout.itemSize = self.frame.size; // 设定全局的行间距 _flowLayout.minimumLineSpacing = 0; _flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; _mainCollectionView = [[UICollectionView alloc] initWithFrame:self.frame collectionViewLayout:_flowLayout]; _mainCollectionView.backgroundColor = [UIColor lightGrayColor]; _mainCollectionView.pagingEnabled = YES; _mainCollectionView.showsHorizontalScrollIndicator = NO; _mainCollectionView.showsVerticalScrollIndicator = NO; // 取消缩放 _mainCollectionView.bouncesZoom = NO; // 取消反弹 _mainCollectionView.bounces = NO; _mainCollectionView.delegate = self; _mainCollectionView.dataSource = self; [_mainCollectionView registerClass:[AdCollectionViewCell class] forCellWithReuseIdentifier:cycleKey]; [self addSubview:_mainCollectionView]; _autoScrollItemTimeInterval = 1.0; // _pageControl = [UIPageControl alloc] initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>) } - (void)setImagesGroup:(NSArray *)imagesGroup { _imageArray = imagesGroup; [self setupTimer]; } /** * @brief 设置定时器 */ - (void)setupTimer { _timer = [NSTimer scheduledTimerWithTimeInterval:self.autoScrollItemTimeInterval target:self selector:@selector(automatiocScroll:) userInfo:nil repeats:YES]; // 使用scheduledTimerWithTimeInterval添加到Run Loop中的Timer就不会执行,所以用NSRunLoopCommonModes [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; } - (void)setAutoScrollItemTimeInterval:(CGFloat)autoScrollItemTimeInterval { _autoScrollItemTimeInterval = autoScrollItemTimeInterval; [_timer invalidate]; _timer = nil; [self setupTimer]; } - (void)automatiocScroll:(NSTimer *)timer { self.currentPageIndex = _mainCollectionView.contentOffset.x / _flowLayout.itemSize.width; NSInteger targetPageIndex = self.currentPageIndex + 1; if (targetPageIndex == self.imageArray.count) { targetPageIndex = self.imageArray.count * 0.5; [_mainCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetPageIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } [_mainCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:targetPageIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } #pragma mark - UICollectionViewDataSource //- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { // return self.imageArray.count; //} - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.imageArray.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { AdCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cycleKey forIndexPath:indexPath]; if (!cell) { cell = [[AdCollectionViewCell alloc] init]; } NSUInteger itemIndex = indexPath.item % self.imageArray.count; if (self.imageArray.count) { cell.adImageView.image = self.imageArray[itemIndex]; } if (self.titleArray.count) { cell.titleString = _titleArray[itemIndex]; } return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { if ([self.delegate respondsToSelector:@selector(cycleScrollView:didSelectAtIndex:)]) { [self.delegate cycleScrollView:self didSelectAtIndex:indexPath.item % self.imageArray.count]; } } #pragma mark - UIScrollviewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSUInteger index = (scrollView.contentOffset.x + _mainCollectionView.ad_width * 0.5) / _mainCollectionView.ad_width; _pageControl.currentPage = index % self.imageArray.count; } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [_timer invalidate]; _timer = nil; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [self setupTimer]; } @end // // AdScrollViewController.m // LJEAdScrollview // // Created by xiaoyao on 15/4/3. // Copyright (c) 2015年 lijien. All rights reserved. // #import "AdScrollViewController.h" #import "UIView+UIViewExtension.h" @interface AdScrollViewController () <AdCycleScrollViewDelegate> @end @implementation AdScrollViewController - (void)viewDidLoad { [super viewDidLoad]; NSArray *images = @[[UIImage imageNamed:@"h1.jpg"], [UIImage imageNamed:@"h2.jpg"], [UIImage imageNamed:@"h3.jpg"], [UIImage imageNamed:@"h4.jpg"] ]; NSArray *titles = @[@"我的梦想是做一名伟大的产品设计师", @"我的目标是张小龙一样开世界微信产品发布会", @"我可以有丰富多彩的生活除了编程之外", @"谢谢各位,尽情吐槽" ]; AdCycleScrollView *scroll = [AdCycleScrollView cycleScrollViewWithFrame:CGRectMake(0, 60, self.view.frame.size.width, 180) imagesGroupArray:images titleArray:titles]; scroll.titleArray = titles; scroll.delegate = self; [self.view addSubview:scroll]; } #pragma mark - SDCycleScrollViewDelegate - (void)cycleScrollView:(AdCycleScrollView *)adScrollView didSelectAtIndex:(NSInteger)index { NSLog(@"---点击了第%ld张图片", index); } @end </span>
原文地址:http://blog.csdn.net/u010606986/article/details/44855573