前言:iOSAPP启动加载时添加广告页面的功能很久之前就存在了,因为现在手上的项目和之前一个项目都没有这一需求,也就没去做。最近发现手机上面的APP几乎八成都用到了启动加载时跳出广告页面,今天上午没什么事就自己写了一个demo出来,代码很简单,在这和大家一起分享参考。
Github:看这里
思路整理:
1、向后台请求数据并进行UI展示(忽略)
2、根据后台返回数据判断加载页面
3、进入广告页面
4、返回到主页面
代码实现:
1、在程序加载完成didFinishLaunch中向后台请求数据,如果有广告数据就呈现广告数据,如果没有广告数据直接进入主页面;这一步思路和做法比较简单,我们用imageView直接加载图片进行代替,实际操作时按上面思路做即可。
2、在后台返回广告数据之后,设置rootViewController为广告页面控制器,这里我们再忽略网络请求步骤的情况下直接赋值:
LanuchViewController *vc = [[LanuchViewController alloc]init];
vc.time = 3;
vc.imgUrl = nil;
vc.url = @"http://www.baidu.com";
self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:vc];
3、在广告页面添加背景视图和跳过按钮,并添加相应的监听事件:
/**广告视图
*/
@property (nonatomic, strong) UIImageView *backImageView;
/**定时器
*/
@property (nonatomic, strong) NSTimer *timer;
/**倒计时
*/
@property (nonatomic, assign) NSInteger time;
/**跳过按钮
*/
@property (nonatomic, strong) UIButton *passBtn;
实例化控件,并添加点击事件:
_backImageView = [[UIImageView alloc]initWithFrame:self.view.bounds];
_backImageView.userInteractionEnabled = YES;
_backImageView.backgroundColor = [UIColor grayColor];
[self.view addSubview:_backImageView];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(jumpToWebView)];
[_backImageView addGestureRecognizer:tap];
_passBtn = [MyControl buttonWithFram:CGRectMake(KScreenWidth-80, 30, 60, 30) title:[NSString stringWithFormat:@"跳过%lds",_time] imageName:nil];
_passBtn.backgroundColor = [UIColor whiteColor];
[_passBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_passBtn addTarget:self action:@selector(jumpToRootViewCtrl) forControlEvents:UIControlEventTouchUpInside];
_passBtn.layer.cornerRadius = 5;
_passBtn.layer.masksToBounds = YES;
[self.view addSubview:_passBtn];
添加定时器
_timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timeCutdown) userInfo:nil repeats:YES];
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:_timer forMode:NSRunLoopCommonModes];
设置倒计时,计时结束是进入主页面
- (void)timeCutdown{
if (self.time > 0) {
[_passBtn setTitle:[NSString stringWithFormat:@"跳过%lds",self.time] forState:UIControlStateNormal];
self.time--;
}else{
[_timer invalidate];
[UIView animateWithDuration:1.5 animations:^{
self.view.alpha = 0;
} completion:^(BOOL finished) {
[UIApplication sharedApplication].keyWindow.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];
}];
}
}
跳转到网页时,先将根试图控制器改变为主页面,之后push到网页,不加动画效果,制造视觉假象。
- (void)jumpToWebView{
[_timer invalidate];
LanuchWebViewController *vc = [[LanuchWebViewController alloc]init];
vc.url = self.url;
MainViewController *main = [[MainViewController alloc]init];
[UIApplication sharedApplication].keyWindow.rootViewController = [[UINavigationController alloc]initWithRootViewController:main];
[main.navigationController pushViewController:vc animated:NO];
}
点击跳过按钮,直接进入到主页面。点击跳转或倒计时结束时,给当前视图添加渐变透明的动画效果。
- (void)jumpToRootViewCtrl{
[_timer invalidate];
[UIView animateWithDuration:0.5 animations:^{
self.view.alpha = 0;
} completion:^(BOOL finished) {
[UIApplication sharedApplication].keyWindow.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];
}];
}
给广告网页页面添加webView和进度条:
@interface LanuchWebViewController ()@property (nonatomic, strong) WKWebView *webView;
@property (nonatomic, strong) UIProgressView *progressView;
@end
WKWebView有一个estimatedProgress属性,可以获取到当前页面加载进度,我们通过KVO方式来动态获取当前加载进度
[_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{
if ([keyPath isEqualToString:@"estimatedProgress"]) {
if ([change[@"new"] floatValue] < [change[@"old"] floatValue]) {
return;
}
[_progressView setProgress:[change[@"new"] floatValue] animated:YES];
if (_progressView.progress == 1.0) {
_progressView.hidden = YES;
[_progressView removeFromSuperview];
}
}
}