广告轮播图

   在大部分的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];
    }
}
   以上处理的是如果当前页是第一页继续向右滑动,和当前页是最后一页继续向左滑动这两种情况。到这里基本上就是所有的代码了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值