iOS中手写广告页

在开发一个电商型的APP,大都会遇见设计广告页的需求。根据领导的喜好,广告的显示机制有个别的差异。有的很简单,有的很复杂。我记录一下我的整个过程。

我定义了一个工具类VersionManager : NSObject在里面我写了实现广告页的整个过程,到时候在APPdelegate里面直接调用就可以了。

a.检查广告的方法

 +(void)checkSplashPic{
[UIApplication sharedApplication].statusBarHidden = NO;
SplashAdvertModel *splash = [UserTool readSplashAdvert];
if (splash.ImagePath.length > 0) {
    UIImage *advert = [UIImage imageWithContentsOfFile:[kImageDirPath stringByAppendingPathComponent:[[splash.ImagePath pathComponents] lastObject]]];
    if (advert) {//如果图片已经下载好
        NSDate *startDate = [NSDate dateWithTimeIntervalSince1970:[splash.StartTime integerValue]];
        NSDate *endDate = [NSDate dateWithTimeIntervalSince1970:[splash.EndTime integerValue]];
        NSDate *now = [NSDate date];
        if ([now compare:startDate] == NSOrderedDescending && [now compare:endDate] == NSOrderedAscending && [splash.IfDisplay isEqualToString:@"1"]) {
            [[VersionManager sharedInstance] showSplashView:advert];
        }
    }else{
        //图片没有下载好,再下载一次
        NSString *imagePath = [kImageDirPath stringByAppendingPathComponent:[[splash.ImagePath pathComponents] lastObject]];
        dispatch_queue_t queue = dispatch_queue_create("imageQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:splash.ImagePath]];
            if (imageData) {
                NSFileManager *manager = [NSFileManager defaultManager];
                if (![manager fileExistsAtPath:kImageDirPath isDirectory:nil]) {
                    [manager createDirectoryAtPath:kImageDirPath withIntermediateDirectories:YES attributes:nil error:nil];
                }
                [imageData writeToFile:imagePath atomically:YES];
            }
        });
    }
}
//更新闪屏页广告设置缓存
[HTTPTool getSplashAdvertSuccess:^(NSDictionary *dict) {
    NSDictionary *splashDict = dict[@"home_list"];
    if (splashDict.allKeys.count > 0) {
        SplashAdvertModel *model = [SplashAdvertModel splashAdvertWithDict:splashDict];
        SplashAdvertModel *oldModel = [UserTool readSplashAdvert];
        if ([model.ImagePath isEqualToString:oldModel.ImagePath]) {//比较图片链接
            //相同图片
        }else{
            NSString *oldImagePath = [kImageDirPath stringByAppendingPathComponent:[[oldModel.ImagePath pathComponents] lastObject]];
            NSFileManager *fileMgr = [NSFileManager defaultManager];
            BOOL bRet = [fileMgr fileExistsAtPath:oldImagePath];
            if (bRet) {
                [fileMgr removeItemAtPath:oldImagePath error:nil];
            }
            [UserTool saveSplashAdvert:model];
            NSString *newImagePath = [kImageDirPath stringByAppendingPathComponent:[[model.ImagePath pathComponents] lastObject]];
            dispatch_queue_t queue = dispatch_queue_create("imageQueue", DISPATCH_QUEUE_CONCURRENT);
            dispatch_async(queue, ^{
                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:model.ImagePath]];
                if (imageData) {
                    NSFileManager *manager = [NSFileManager defaultManager];
                    if (![manager fileExistsAtPath:kImageDirPath isDirectory:nil]) {
                        [manager createDirectoryAtPath:kImageDirPath withIntermediateDirectories:YES attributes:nil error:nil];
                    }
                    [imageData writeToFile:newImagePath atomically:YES];
                    CLLog(@"%@",@"更新splash图片");
                }
            });
        }
    }else{
        //网络链接失败,或图片置空
        [UserTool deleteSplashData];
    }
}failure:^(NSError *error) {
    CLLog(@"%@",error);
}];

b.如何展示广告页的方法

-(void)showSplashView:(UIImage *)image{
//根据过期时间,设置广告弹窗的时间,过期再重置
if ([SWTTimerManager timerMangerNotUpdateForHour:kCheckSplashAdvertLimitInterval andTag:@"splashAdvert"]){//没过期,那就显示3秒
    _closeSEC = 2;
}else{//过期
    _closeSEC = kSplashTimer;
}
[UIApplication sharedApplication].statusBarHidden = YES;
[self.boardView removeFromSuperview];
UIView *view = [[UIApplication sharedApplication].windows lastObject];
UIView *boardView = [[UIView alloc] initWithFrame:view.bounds];
_boardView = boardView;
[view addSubview:boardView];
UIImageView *advert = [[UIImageView alloc] init]; //加载图片
advert.image = image;
[boardView addSubview:advert];
[advert mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.left.right.bottom.equalTo(boardView);
}];
advert.userInteractionEnabled = YES;
UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(goToAdvertLink)];
[advert addGestureRecognizer:tap];    
//设置关闭按钮
UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_closeBtn = closeBtn;
[boardView addSubview:closeBtn];
[closeBtn setTitle:[NSString stringWithFormat:@"%ld秒关闭",_closeSEC + 1] forState:UIControlStateNormal];
[closeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
closeBtn.backgroundColor = RGB(200, 200, 200);
closeBtn.titleLabel.font = FontWithName(14);
closeBtn.layer.cornerRadius = 5;
closeBtn.layer.masksToBounds = YES;
closeBtn.alpha = 0.7;
[closeBtn addTarget:self action:@selector(closeSplashView) forControlEvents:UIControlEventTouchUpInside];
[closeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(boardView).offset(-30);
    make.top.equalTo(boardView).offset(35);
    make.size.mas_equalTo(CGSizeMake(70, 30));
}];    
[_splashTimer invalidate];
_splashTimer = nil;    
WEAKSELF
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf changeBtnTimer];
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeBtnTimer) userInfo:nil repeats:YES];
    weakSelf.splashTimer = timer;
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
});}

c.跟换按钮上跳动的时间的方法

-(void)changeBtnTimer{
if (_closeSEC <= 0) {
    [self closeSplashView];
}else{
    [_closeBtn setTitle:[NSString stringWithFormat:@"%ld秒关闭",(long)_closeSEC] forState:UIControlStateNormal];
    _closeSEC -- ;
}}

d.关闭闪屏广告的方法

-(void)closeSplashView{
[UIApplication sharedApplication].statusBarHidden = NO;
[_splashTimer invalidate];
_splashTimer = nil;
[_closeBtn setTitle:@"0秒关闭" forState:UIControlStateNormal];
WEAKSELF
[UIView animateWithDuration:0.5 animations:^{
    weakSelf.boardView.alpha = 0.01;
} completion:^(BOOL finished) {
    [weakSelf.boardView removeFromSuperview];
}];}

然后基本过程就完成了,你只需要在使用的地方写上//闪屏广告 [VersionManager checkSplashPic];这句话,比如你想程序启动的时候展示,那就写在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}中,如果你想在后台每次打开都有,那就写在- (void)applicationWillEnterForeground:(UIApplication *)application{}即可,我把2中效果连在一起展示一下

Untitled.gif

不过现在有很多第三方,直接拿来用就好了。我只是闲的无聊,随便写写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容