资讯专栏INFORMATION COLUMN

iOS广告页的编写

you_De / 2706人阅读

摘要:功能在我们刚刚打开时,一般首页会有一个广告展示的页面,能显示几张自动翻滚的图片,还能通过点击来跳转到对应页。上了三个当前显示的显示的前一个显示的后一个。的为的,因为控件显示的是的中间页。通过来重新设置显示的内容。

功能:
在我们刚刚打开App时,一般首页会有一个广告展示的页面,能显示几张自动翻滚的图片,还能通过点击来跳转到对应页。
如下图:

实现
这是一个给项目中Controller类用的CustomView,需要在多个Controller中使用,可以多带带写一个类,继承UIView,然后定义delegate和datasource,在Controller类里实现delegate和datasouce方法,来显示的具体内容。这个CustomView主要通过一个ScrollView+PageView实现。Scrolview上Add了三个SubViews:当前显示的View、显示View的前一个View、显示View的后一个View。
具体实现 1、创建控件并显示
自定义了一个CustomView,有两种方法来init:代码和xib文件。这时会调用CustomView的不同init方法。从代码创建时,调用initWithFrame;而从xib文件创建时,调用initWithCoder。

这边用代码来创建控件。首先会调用initwithframe方法来创建控件并设置控件frame。在这个方法里,创建了scrollview和pageview,并add到当前类的view中。_scrollview的contentoffset为frame的width,因为控件显示的是scrollview的中间页。
//创建控件,写在Controller类的loadview方法中
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
        _scrollView.delegate = self;
        _scrollView.contentSize = CGSizeMake(self.frame.size.width * 3, self.frame.size.height);
        _scrollView.showsHorizontalScrollIndicator = NO;
        _scrollView.contentOffset = CGPointMake(self.frame.size.width, 0);
        _scrollView.pagingEnabled = YES;
        [self addSubview:_scrollView];
        CGRect rect = CGRectMake(80, self.bounds.size.height - 20, 160, 20);
        _pageControl = [[UIPageControl alloc] initWithFrame:rect];
        _pageControl.userInteractionEnabled = NO;
        [self addSubview:_pageControl];
        //控件显示的页面
        _curPage = 0;
    }
    return self;
}
控件创建了,不过内容是空的。怎么添加具体内容呢?当然是在Controller类中实现delegate和datasource方法了。

在CustomView的.h文件中:

//内存管理方式是MRC
@property (nonatomic,assign,setter = setDataource:) id datasource;

@protocol XLCycleScrollViewDatasource 
@required
- (NSInteger)numberOfPages;
- (UIView *)pageAtIndex:(NSInteger)index;

@end

在Controller类中,CustomView.dataSouce = self;程序就跑到CustomView的setDataource;方法中。在这个方法里,我们就可以设置显示的内容。

- (void)setDataource:(id)datasource
{
    _datasource = datasource;
    [self reloadData];
}

- (void)reloadData
{
    _totalPages = [_datasource numberOfPages];
    if (_totalPages == 0) {
        return;
    }
    _pageControl.numberOfPages = _totalPages;
    [self loadData];
}

- (void)loadData
{

    _pageControl.currentPage = _curPage;

    //从scrollView上移除所有的subview
    NSArray *subViews = [_scrollView subviews];
    if([subViews count] != 0) {
        [subViews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    }
    //通过_curPage(当前显示的页面),来设置显示在Scrollview上的3个View(保存在_curViews中)
    [self getDisplayImagesWithCurpage:_curPage];

    for (int i = 0; i < 3; i++) {
        UIView *v = [_curViews objectAtIndex:i];
        v.userInteractionEnabled = YES;
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                    action:@selector(handleTap:)];
        [v addGestureRecognizer:singleTap];
        [singleTap release];
        v.frame = CGRectOffset(v.frame, v.frame.size.width * i, 0);
        [_scrollView addSubview:v];
    }
    //中间页为显示页
    [_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width, 0)];
}

在设置_datasource = datasource;后,就可以通过[_datasouce functionName];来调用Controller类中实现的datasouce方法了。_curViews是一个NSMutableArray类,通过_curPage具体设置其中的3个object。

/**
 *  获取需要显示的3个View
 *
 *  @param page 当前显示页
 */
- (void)getDisplayImagesWithCurpage:(int)page {

    int pre = [self validPageValue:_curPage-1];
    int last = [self validPageValue:_curPage+1];

    if (!_curViews) {
        _curViews = [[NSMutableArray alloc] init];
    }

    [_curViews removeAllObjects];
    [_curViews addObject:[_datasource pageAtIndex:pre]];
    [_curViews addObject:[_datasource pageAtIndex:page]];
    [_curViews addObject:[_datasource pageAtIndex:last]];
}

可以看到,在loadData方法中,为每个View添加了Tap手势,实现点击功能。

到这里,控件创建了并在Controller上显示了第一页。理一理,假设Controller类为A,CustomView为B。
[A loadView] -> [B initWithFrame] -> A类中B.dataSource = self;->[B setDataSouce:]

2、滑动控件,View切换

通过- (void)scrollViewDidScroll:要捕获ScrolView的滚动事件,可以获取当前ScrollView的contentOffSSet。

#pragma mark - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    int x = aScrollView.contentOffset.x;

    //往下翻一张
    if(x == (2*self.frame.size.width)) {
        _curPage = [self validPageValue:_curPage+1];
        [self loadData];
    }

    //往上翻
    if(x == 0) {
        _curPage = [self validPageValue:_curPage-1];
        [self loadData];
    }
}

因为设置了ScrollVeiw的pageEnabled属性未yes,ScrollView就会根据view来设置ContentOffSet,界面不会停留在某个view的中间。通过[self loadData]来重新设置ScrollView显示的内容。

结束了

到这儿,功能就实现了,还可以通过添加NSTimer来动态显示,就是可以每隔N秒,自动切换图片。
点击下载代码

我觉得有意思的一点:界面都是在代码运行完后显示的,就是说,一个关于界面的方法,在return后,界面才会更新(可以通过GCD来设置界面更新的顺序)。在- (void)scrollViewDidScroll:方法中,假如界面滑动到了下一个View,这个View替换了显示的View时,就调用了[self loadData]方法,这个方法里,又重新设置了ScrollView的内容,又刷新了ScrollView。就显示下一个内容来说,看着是很顺畅显示到了下个页面,中间的调用[self loadDta]页面的刷新,完全被覆盖了。神奇~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15583.html

相关文章

  • 马蜂窝 iOS App 启动治理:回归用户体验

    摘要:马蜂窝旅游历经几十个版本的开发迭代,在启动流程上积累了一定的技术债务。我们定义启动广告曝光率启动广告曝光启动广告加载。 增长、活跃、留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能。启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率。因此,确保启动流程的良好体验至关重要。 「马蜂窝旅游」App 是马蜂窝为用户提供...

    JouyPub 评论0 收藏0
  • 马蜂窝 iOS App 启动治理:回归用户体验

    摘要:马蜂窝旅游历经几十个版本的开发迭代,在启动流程上积累了一定的技术债务。我们定义启动广告曝光率启动广告曝光启动广告加载。 增长、活跃、留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能。启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率。因此,确保启动流程的良好体验至关重要。 「马蜂窝旅游」App 是马蜂窝为用户提供...

    Jinkey 评论0 收藏0
  • iOS引导页的编写

    摘要:我们在第一次打开的时候,通常不是直接进入主界面,而是会有一个能左右滑动介绍功能的界面。新建一个类,继承,假设名为。在方法里这样,就有了一个有张图片的引导页。怎么去判断是不是第一次登陆呢,需要用到类。在函数中可以这样判断显示引导页 我们在第一次打开App的时候,通常不是直接进入App主界面,而是会有一个能左右滑动、介绍App功能的界面。我是用NSUserDefaults + UIScro...

    opengps 评论0 收藏0
  • Android-开发姿势

    摘要:微信这类怎么做谈谈八款开发者必备的小工具八款开发者必备的小工具笔记之图像压缩开发中的图像压缩是一个很重要的部分。 Android 攻城狮—全套必备神级工具(开发,插件,效率) 如果你有用的酸爽的软件,请下面留言。我会持续更新。。。 替你 总结的 Gradle 配置 关于 Gradle 配置的一些总结,欢迎交流! 常用的代码片段,不断更新 项目中平常会用到的代码片段,以及一些收集的好的代...

    jifei 评论0 收藏0
  • 新站上线,分享10个最强chrome浏览器插件!瞬间开发效率加倍

    摘要:新站极简插件打磨已久,终于上线访问地址借此机会,推荐个最强插件,瞬间开发效率加倍用于调试应用程序的和扩展。可以解决扩展无法自动更新的问题,同时可以访问谷歌搜索,邮箱,等谷歌服务。 showImg(http://upload-images.jianshu.io/upload_images/15934130-50747924438e3c47.jpg?imageMogr2/auto-orie...

    cnio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<