在大部分的APP开发中都将会用到这个广告轮播图,用来循环展示广告或者一些活动,整体逻辑处理起来并不复杂
主要代码如下:
if (adImageArray.count > 0) {
//如果有图片那么将创建scroll轮播图
adSroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, kScreenHeight - 110, kScreenWidth, 110)];
adSroll.showsHorizontalScrollIndicator = NO;
adSroll.showsVerticalScrollIndicator = NO;
adSroll.pagingEnabled = YES;
adSroll.bounces = YES;
adSroll.delegate = self;
if (adImageArray.count > 1) {
//此处多创建了两个view的宽度,很多初学者不大理解,这也是后面滑动部分要处理的一个关键
adSroll.contentSize = CGSizeMake(kScreenWidth * (adImageArray.count + 2), 110);
for (int i = 0; i <= adImageArray.count + 1; i++) {
CFBusinesses *aData = [adImageArray objectAtIndex:(i -1)==-1?(adImageArray.count-1):((i -1)==adImageArray.count?0:(i -1))];
[self creatAdImageWithPage:i url:aData.img_url count:i];
}
[adSroll setContentOffset:CGPointMake(kScreenWidth, 0)];
//创建轮播图下面跟着滑动的小圆点pageControl
pageControl = [[MyPageControl alloc] initWithFrame:CGRectMake(0, kScreenHeight - 30, kScreenWidth, 20)];
pageControl.numberOfPages = adImageArray.count;
pageControl.currentPage = 0;
[pageControl addTarget:self action:@selector(handleClickAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:adSroll];
[self.view addSubview:pageControl];
adTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerNextPage:) userInfo:nil repeats:YES];
} else {
//此处处理没有获得广告图片时的情况,我一般是添加一张给定的广告图
CFBusinesses *aD = adImageArray[0];
[self creatAdImageWithPage:0 url:aD.img_url count:1];
[self.view addSubview:adSroll];
}
}
完整的轮播图主要在于处理好计时器部分的响应事件以及scrollView的滑动代理方法
//timer触发的自动换页事件
- (void)timerNextPage:(id)sender
{
if (pageControl.currentPage < (pageControl.numberOfPages-1)) {
pageControl.currentPage = pageControl.currentPage + 1;
} else {
pageControl.currentPage = 0;
}
//计算当前在第几页
NSInteger realCurrentPage = fabs(adSroll.contentOffset.x) / adSroll.frame.size.width;
if (pageControl.currentPage == 0 && realCurrentPage == adImageArray.count) {
realCurrentPage = adImageArray.count+1;
} else if (pageControl.currentPage == adImageArray.count-1 && realCurrentPage == 1) {
realCurrentPage = 0;
} else {
realCurrentPage = pageControl.currentPage+1;
}
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * realCurrentPage, 0.0, kScreenWidth, adHeight) animated:YES];
}
//点击pageControl的响应事件
- (void)handleClickAction:(id)sender
{
[adTimer invalidate];
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * (pageControl.currentPage + 1), 0.0, kScreenWidth, adHeight) animated:YES];
[pageControl setCurrentPage:pageControl.currentPage];
adTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerNextPage:) userInfo:nil repeats:YES];
}
此处的逻辑主要在于滑动到最后一页事回转到第一页。当然如果考虑到用户会用手势左右滑动,那你还应该处理好scrollView的滑动代理方法
#pragma mark - scrollView delegate methods -
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
if (scrollView == adSroll) {
NSInteger realCurrentPage = fabs(adSroll.contentOffset.x) / adSroll.frame.size.width;
if (realCurrentPage==0) {
realCurrentPage = adImageArray.count;
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * realCurrentPage, 0.0, kScreenWidth, adHeight) animated:NO];
} else if (realCurrentPage == adImageArray.count+1) {
realCurrentPage = 1;
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * realCurrentPage, 0.0, kScreenWidth, adHeight) animated:NO];
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (scrollView == adSroll) {
[adTimer invalidate];
NSInteger realCurrentPage = fabs(adSroll.contentOffset.x) / adSroll.frame.size.width;
if (realCurrentPage == 0) {
realCurrentPage = adImageArray.count;
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * realCurrentPage, 0.0, kScreenWidth, adHeight) animated:NO];
} else if (realCurrentPage == adImageArray.count+1) {
realCurrentPage = 1;
[adSroll scrollRectToVisible:CGRectMake(kScreenWidth * realCurrentPage, 0.0, kScreenWidth, adHeight) animated:NO];
}
[pageControl setCurrentPage:realCurrentPage-1];
adTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerNextPage:) userInfo:nil repeats:YES];
}
}
以上处理的是如果当前页是第一页继续向右滑动,和当前页是最后一页继续向左滑动这两种情况。到这里基本上就是所有的代码了。