百思不得姐之广告界面(三)
来源:互联网 发布:2014年网络流行歌曲 编辑:程序博客网 时间:2024/04/30 00:46
一 概述和总体功能图
1 广告界面的意思: 当用户点击启动一个app的时候,app并不会马上显示到主框架,而是先在屏幕中加载一张图片,而这张图片就称之为广告.由于图片是从服务器中请求的,所以每次启动app加载的广告图片都是不一样的.
2 设置广告界面的原因: 反正用户启动app的时候都会花费一点时间才会跳转到主界面,于是商家就利用这段时间做出了这样一种广告界面,同时也提供用户选择,如果不想等就可以直接跳过.
3 趋势: 现在很多的app都有这样的一个界面,也是目前很多app的趋势,也能为很多商家带来商业价值.
4 总体功能图
二 屏幕适配
1 屏幕适配原因: 让app加载的广告图片能在不同的iphone中运行,保证图片的样式不被拉伸,形变.
2 实现思路: 根据不同的屏幕的高度来设置不同尺寸的图片
3 具体实现步骤:
—-> 3.1 创建加载广告的文件(同时创建xib)
—-> 3.2 修改app的根控制器,让根控制器指向加载广告的控制器
—> 代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //1.创建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //2.设置根控制器 //2.1 创建根控制器(将根控制器设置为广告控制器) XFJADViewController *adVC = [[XFJADViewController alloc] init]; self.window.rootViewController = adVC; //显示窗口 [self.window makeKeyAndVisible]; return YES;}
4 需要定义的屏幕适配的宏
//屏幕适配#define ipone6P (XFJ_screenH == 736)#define iphone6 (XFJ_screenH == 667)#define iphone5 (XFJ_screenH == 568)#define iphone4 (XFJ_screenH == 480)
5 实现屏幕适配的判断
#pragma mark - 实现图片加载的方法(屏幕适配)- (void)setUpImage{ //判断 UIImage *image = nil; if (ipone6P) { image = [UIImage imageNamed:@"LaunchImage-800-Portrait-736h@3x"]; }else if (iphone6){ image = [UIImage imageNamed:@"LaunchImage-800-667h"]; }else if (iphone5){ image = [UIImage imageNamed:@"LaunchImage-700-568h"]; }else if (iphone4){ image = [UIImage imageNamed:@"LaunchImage-568h"]; } self.imageView.image = image;}
三 cocoapods的使用
1 由于该部分需要使用到框架,那么我在这简单介绍下cocoapods的使用.
—-> 注意:命令行:touch 创建文件 open:打开 cd: 进入到某个文件夹
—–> 1.1 –no-repo-update:不需要更新仓库,迅速加载第三方框架
—–> 1.2 创建podfile文件,描述需要导入的第三方框架
—–> 1.3 获取框架描述 pod search 第三方框架
—–> 1.4 加载第三方框架 pod install/ pod update
四 xib的结构
1 加载广告界面用到xib,我在这为大家奉上我使用xib的内部控件图
五 广告界面
1 业务逻辑:
—–> 1> 点击广告图片,跳转到广告界面,用safari打开
—–> 2> 广告界面倒计时
—–> 3> 点击跳过,直接进入到主框架界面
2 加载广告数据
注意: 由于该部分需要些很多代码,那么我们就抽一个方法,在一个方法中实现功能.
加载广告数据步骤:
——> 1> 请求数据
——> 2> 查看接口文档
——> 3> 测试接口文档有没有问题
——> 4> 解析数据
3 接口数据定义成宏
#define XFJ_code2 @"phcqnauGuHYkFMRquANhmgN_IauBThfqmgKsUARhIWdGULPxnz3vndtkQW08nau_I1Y1P1Rhmhwz5Hb8nBuL5HDknWRhTA_qmvqVQhGGUhI_py4MQhF1TvChmgKY5H6hmyPW5RFRHzuET1dGULnhuAN85HchUy7s5HDhIywGujY3P1n3mWb1PvDLnvF-Pyf4mHR4nyRvmWPBmhwBPjcLPyfsPHT3uWm4FMPLpHYkFh7sTA-b5yRzPj6sPvRdFhPdTWYsFMKzuykEmyfqnauGuAu95Rnsnbfknbm1QHnkwW6VPjujnBdKfWD1QHnsnbRsnHwKfYwAwiu9mLfqHbD_H70hTv6qnHn1PauVmynqnjclnj0lnj0lnj0lnj0lnj0hThYqniuVujYkFhkC5HRvnB3dFh7spyfqnW0srj64nBu9TjYsFMub5HDhTZFEujdzTLK_mgPCFMP85Rnsnbfknbm1QHnkwW6VPjujnBdKfWD1QHnsnbRsnHwKfYwAwiuBnHfdnjD4rjnvPWYkFh7sTZu-TWY1QW68nBuWUHYdnHchIAYqPHDzFhqsmyPGIZbqniuYThuYTjd1uAVxnz3vnzu9IjYzFh6qP1RsFMws5y-fpAq8uHT_nBuYmycqnau1IjYkPjRsnHb3n1mvnHDkQWD4niuVmybqniu1uy3qwD-HQDFKHakHHNn_HR7fQ7uDQ7PcHzkHiR3_RYqNQD7jfzkPiRn_wdKHQDP5HikPfRb_fNc_NbwPQDdRHzkDiNchTvwW5HnvPj0zQWndnHRvnBsdPWb4ri3kPW0kPHmhmLnqPH6LP1ndm1-WPyDvnHKBrAw9nju9PHIhmH9WmH6zrjRhTv7_5iu85HDhTvd15HDhTLTqP1RsFh4ETjYYPW0sPzuVuyYqn1mYnjc8nWbvrjTdQjRvrHb4QWDvnjDdPBuk5yRzPj6sPvRdgvPsTBu_my4bTvP9TARqnam"
4 导入AFN,MJ和SDW框架
#import <AFNetworking/AFNetworking.h>#import <MJExtension/MJExtension.h>#import <UIImageView+WebCache.h>
5 请求数据三大步:
5.1 创建会话管理者
5.2 创建请求参数
5.3 执行请求任务
—–> 5.3.1 字典转模型
—–> 5.3.2 判断请求到的图片宽度为0的可能性
—–> 5.3.3 加载广告图片
—–> 5.3.4 JSON写入plist文件数据(目的:面向模型开发)
代码部分:
#pragma mark - 请求数据- (void)setUpDate{ //创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //创建请求参数 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; //包装请求体 parameters[@"code2"] = XFJ_code2; //执行任务 [manager GET:@"http://mobads.baidu.com/cpro/ui/mads.php" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //取出plist文件中的ad广告 NSDictionary *dict = [responseObject[@"ad"] firstObject]; //字典转模型(没有模型,需要创建一个模型) //创建一个模型(字典转模型) self.item = [XFJADItem mj_objectWithKeyValues:dict]; //判断图片的宽度可能会为0的情况 if (self.item.w == 0) { return ; } //宽度 CGFloat w = XFJ_screenW; //高度 CGFloat h = XFJ_screenW / self.item.w * self.item.h; //广告图片的高度 self.imageView2.frame = CGRectMake(0, 0, w, h); //加载广告的图片(导入框架) [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:self.item.w_picurl]]; //将返回的响应体信息转为plist文件--->目的是为了面向模型开发 [responseObject writeToFile:@"/Users/xiaofeng/Desktop/BuDeJie/ad.plist" atomically:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];}
5 问题:服务器返回出来的数据,AFN框架并不能解析,那么我们怎么办呢?
解决:
//直接跳到manager中找到self.responseSerializer = [AFJSONResponseSerializer serializer],然后找到self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];将服务器返回的格式加入到AFN框架中
六 模型
1 模型中属性的获取:从接口文档中查找到模型中只需要以下属性
//w_picurl,ori_curl:广告界面跳转地址,w,h
2 模型属性:
/** * 图片 */@property (nonatomic, strong) NSString *w_picurl;/** * 广告的地址 */@property (nonatomic, strong) NSString *ori_curl;/** * 宽度 */@property (nonatomic, assign) CGFloat w;/** * 高度 */@property (nonatomic, assign) CGFloat h;
七 需要用到的定义属性
/** * 启动界面(拖线) */@property (weak, nonatomic) IBOutlet UIImageView *imageView;/** * 占位view(拖线) */@property (weak, nonatomic) IBOutlet UIView *adView;/** * 用来装图片的 */@property (nonatomic, strong) UIImageView *imageView2;/** * 跳转按钮(拖线) */@property (weak, nonatomic) IBOutlet UIButton *jumpBtn;/** * 定时器(用weak的原因是因为,定时器是系统的,系统会自动管理) */@property (nonatomic, weak) NSTimer *timer;/** * 模型 */@property (nonatomic, strong) XFJADItem *item;
八 加载广告图片
1 由于我们发送了请求任务,那么我们需要设置一个属性来作为设置图片显示,这里只需要创建一次,那么我们直接用懒加载.
#pragma mark - 懒加载(因为只需要创建一次)- (UIImageView *)imageView2{ if (_imageView2 == nil) { //创建图片对象 UIImageView *imageView = [[UIImageView alloc] init]; //赋值 _imageView2 = imageView; //添加 [self.adView addSubview:imageView]; //设允许与用户交互(设置的原因:因为用户很有可能需要点击图片,然后跳转到safari中) imageView.userInteractionEnabled = YES; //创建点按手势 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)]; //给图片添加点按手势 [imageView addGestureRecognizer:tap]; } return _imageView2;}
九 点击广告跳转到safari
1 实现思路: 直接给图片添加一个点按手势(第八点已经添加了)
2 在点按手势的方法中实现safari的跳转(实现点按手势的方法)
#pragma mark - 实现点按手势的方法- (void)tap{ //跳转到广告界面(通过单例,拿到应用程序) UIApplication *app = [UIApplication sharedApplication]; //判断该地址是否可以跳转 if ([app canOpenURL:[NSURL URLWithString:self.item.ori_curl]]) { //如果满足条件,那么就跳转 [app openURL:[NSURL URLWithString:self.item.ori_curl]]; }}
十 广告界面倒计时
1 实现思路:添加定时器
2 移除定时器
3 添加定时器(直接在viewDidLoad中创建定时器)
//创建定时器 self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
4 通过拖线的方式,我们能监听跳过按钮
注意: 跳转完记得销毁定时器
- (IBAction)jumpBtnClick{ //点击跳转按钮,将控制器的根控制器设置为XFJTabBarController [UIApplication sharedApplication].keyWindow.rootViewController = [[XFJTabBarController alloc] init]; //因为用户直接点击了跳转按钮,那么就直接将定时器销毁 [self.timer invalidate];}
5 实现定时器中的方法
—–> 1 判断:定时完成,直接跳转到主框架
—–> 2 设置跳转按钮中文字的倒计时
#pragma mark - 实现定时器中的方法- (void)timeChange{ //判断 static int i = 3; if (i <= 0) { //等于0的时候直接调用设置根控制器的方法 [self jumpBtnClick]; } i --; //设置倒计时的字样 NSString *str = [NSString stringWithFormat:@"跳转 (%d)",i]; //将设置好的字样添加到按钮中 [self.jumpBtn setTitle:str forState:UIControlStateNormal];}
十一 问题
1 计时完成,跳转主窗口,为什么不用modal或者push?
解答:modal是从底部直接推出;push是从旁边直接推出,都不符合条件,所以直接用修改根控制器的方式
2 怎么调整广告按钮倒计时的样式,不让它一闪一闪的?
解答:直接修改storyboard中的按钮演示为constam,默认是system
3 加载广告的时候回出现不完整的图片
解答:这是正常现象,由于图片没有拉伸,这样会使得加载出来的图片底部出现不完整的部分.
十二 总结
—–> 今天为大家总结的是app中加载广告的部分,其中业务逻辑还是不难,希望我写的一些东西能为大家解答疑惑,有什么问题哪里不是很懂的可以私信我.如果你看后觉得还满意,那么希望你关注我的官方博客,谢谢!!!!
2 0
- 百思不得姐之广告界面(三)
- 《百思不得姐》
- 百思不得姐
- 百思不得姐之新帖(四)
- 百思不得姐之立即登录注册模块(五)
- 百思不得姐之"我的"模块功能(六)
- 精度解析百思不得姐流行框架之精华版
- 百思不得姐之自定义cell(八)
- 百思不得姐之图片处理(保存与下载)
- 微信小程序实战之百思不得姐精简版
- 微信小程序实战之百思不得姐精简版
- 百思不得姐项目学习总结
- 02-百思不得姐(第二天)
- 03-百思不得姐(第三天)
- 04-百思不得姐(第四天)
- 02百思不得姐设置TabBar
- 03百思不得姐appearance使用
- 百思不得姐框架(一)
- 算法分析之归并排序——算法整体实现过程
- ArrayList底层实现
- AJAX+JAVA实现登录的实时验证
- mysql必知必会--第一回 检索单个表列 多个表列
- plsql 返回结果集的存储过程
- 百思不得姐之广告界面(三)
- leetcode_110 Balanced Binary Tree
- Java native关键字
- Android学习----四大基本组件之一Activity(1)
- 本博客停止更新
- String,String Buffer,数组,对象和类的简单总结
- caffe源码解析的三个博客分享
- 完全免费!Xamarin应用商店最受欢迎的10款用户界面工具
- kafka的部署及错误排除