自定义一个简单易用的广告启动页面

一、准备工作

1、添加一个LaunchImage,添加常用手机尺寸启动图片,并配置Target如图:

配置

二、撸代码

1、添加一个AppDelegate的分类

2、在AppDelegate中导入这个分类

#import "AppDelegate.h"
#import "ViewController.h"
#import "AppDelegate+LanuchAD.h"


@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController *vc = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    
    //广告
    [self setupLaunchImage];
    
    return YES;
}

3、 广告[self setupLaunchImage]

//
//  AppDelegate+LanuchAD.m
//  自定义启动图广告
//
//  Created by haozp on 2016/12/17.
//  Copyright © 2016年 haozp. All rights reserved.
//

#import "AppDelegate+LanuchAD.h"
#import "DisplayADView.h"

static NSString * const imageUrlString = @"http://img04.tooopen.com/images/20130813/tooopen_15525804.jpg";

@implementation AppDelegate (LanuchAD)

- (void)setupLaunchImage{
    
    [self showADImage1];
   
}
//利用SDWebImage加载图片
- (void)showADImage1{
    //获取网络图片可以用SDWebImage 来添加缓存
    NSURL *url = [NSURL URLWithString:imageUrlString];
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]];
    
    DisplayADView *displayADView = [[DisplayADView alloc] initWithImage:image andFrame:self.window.bounds];
    
    
    //[UIApplication sharedApplication].keyWindow
    [self.window addSubview:displayADView];
}

//利用本地缓存加载图片
- (void)showADImage2{
    if([self checkIfImageExist]){
        //显示本地图片
        
        UIImage *image = [UIImage imageWithContentsOfFile:[self getLanuchImagePath]];
        
        DisplayADView *displayADView = [[DisplayADView alloc] initWithImage:image andFrame:self.window.bounds];
        
        
        //[UIApplication sharedApplication].keyWindow
        [self.window addSubview:displayADView];
        
    }else{
        [self getRemoteImage];
    }

}

//判断图片是否存在
- (BOOL)checkIfImageExist{
    
    return [[NSFileManager defaultManager] fileExistsAtPath:[self getLanuchImagePath]];
}

//获取网络图片
- (void)getRemoteImage{
    
    NSURL *url = [NSURL URLWithString:imageUrlString];
    
    NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(error){
            NSLog(@"error = %@",error.localizedDescription);
        }else{
            if([data writeToFile:[self getLanuchImagePath] atomically:YES]){
                NSLog(@"图片已经保存到本地!");
            }
            
        }
    }];
    
    [dataTask resume];
}

//获取图片所在地址
- (NSString *)getLanuchImagePath{
    
    NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = cachePaths[0];
    
    NSString *imagePath = [cachePath stringByAppendingPathComponent:@"launchImage.png"];
    
    return imagePath;
}


@end

3、DisplayADView

//
//  DisplayADView.m
//  自定义启动图广告
//
//  Created by haozp on 2016/12/17.
//  Copyright © 2016年 haozp. All rights reserved.
//

#import "DisplayADView.h"

@interface DisplayADView ()
@property (nonatomic,strong)NSTimer *timer;
@property (nonatomic,assign)int leftTime;
@property (nonatomic, strong) UIButton *skipButton;
@end

@implementation DisplayADView

- (instancetype)initWithImage:(UIImage *)image andFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        NSDictionary *infoDict = [NSBundle mainBundle].infoDictionary;
        NSLog(@"=%@",infoDict);
        
        //拿到启动图数组
        NSArray *launchImages = [infoDict objectForKey:@"UILaunchImages"];
        
        for (NSDictionary *imageDict in launchImages) {
            
            NSString *imageSizeStr = [imageDict objectForKey:@"UILaunchImageSize"];
            CGSize imageSize = CGSizeFromString(imageSizeStr);
            
            if (CGSizeEqualToSize(imageSize, [UIScreen mainScreen].bounds.size)) {
                NSString *imageName = [imageDict objectForKey:@"UILaunchImageName"];
                UIImage *image = [UIImage imageNamed:imageName];
                
                UIColor *bgcolor = [UIColor colorWithPatternImage:image];
                self.backgroundColor = bgcolor;
                
//                self.backgroundColor = [UIColor redColor];
            }
        }
        
       
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), 5*CGRectGetHeight(self.bounds)/6.0)];
        imageView.image = image;
        [self addSubview:imageView];
        
        //添加一个点击手势,点击跳广告详情页面
        UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGRAction)];
        [imageView addGestureRecognizer:tapGR];
        imageView.userInteractionEnabled = YES;
        
        //倒计时
        _leftTime = 10;
        
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
        
        //按钮
        CGFloat buttonWidth = 50;
        UIButton *skipButton = [[UIButton alloc]initWithFrame:CGRectMake(CGRectGetWidth(self.bounds)-80, 60, buttonWidth, buttonWidth)];
        self.skipButton = skipButton;
        skipButton.layer.cornerRadius = buttonWidth/2.0;
        skipButton.layer.masksToBounds = YES;
        skipButton.backgroundColor = [UIColor yellowColor];
        skipButton.titleLabel.numberOfLines = 2;
        skipButton.titleLabel.textAlignment = 1;
        [skipButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [skipButton addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
        [skipButton setTitle:@"10s\n跳过" forState:UIControlStateNormal];
        skipButton.titleLabel.font = [UIFont systemFontOfSize:13];
        [self addSubview:skipButton];
        
        
        //倒计时动画***
        CAShapeLayer *shapeLayer = [CAShapeLayer layer];
        //画个圆
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(buttonWidth/2, buttonWidth/2) radius:buttonWidth/2 startAngle:0 endAngle:2 * M_PI clockwise:YES];
        shapeLayer.path = path.CGPath;
        shapeLayer.lineWidth = 4;
        shapeLayer.strokeColor = [UIColor redColor].CGColor;
        shapeLayer.fillColor = [UIColor lightGrayColor].CGColor;
        
        //线路动画
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
        animation.fromValue = @0;
        animation.toValue = @1;
        animation.duration = _leftTime;
        
        [shapeLayer addAnimation:animation forKey:nil];
        
        
        [skipButton.layer insertSublayer:shapeLayer atIndex:0];
    }
    return self;
}

- (void)timerAction{
    _leftTime --;
    if (_leftTime == 0) {
        [self dismiss];
    }
    
    [self.skipButton setTitle:[NSString stringWithFormat:@"%ds\n跳过",_leftTime] forState:UIControlStateNormal];
}

- (void)dismiss{
    [self removeFromSuperview];
    [self.timer invalidate];

}


- (void)tapGRAction{
    [self dismiss];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"skipToAD" object:nil];
}


@end

4、ViewControllert

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"首页";
    self.view.backgroundColor = [UIColor whiteColor];
    
    //跳转广告的通知
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(skipToAD) name:@"skipToAD" object:nil];
}
- (void)skipToAD{
    ADViewController *adVC = [[ADViewController alloc] init];
    [self.navigationController pushViewController:adVC animated:YES];
}

效果图

效果图.png

上述代码可以到我的GitHub中下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容