内容简介:PM 提了个需求,启动广告界面点击了, 就直接进,不需要闪一下主界面。一般的广告界面就是 Key Window 上面的遮罩(子视图)。要从广告界面 push,自然广告界面是一个控制器了。 提升广告界面的层级,才可以。
PM 提了个需求,启动广告界面点击了, 就直接进,不需要闪一下主界面。
要这种:
实现的思路,多 window 模式
一般的广告界面就是 Key Window 上面的遮罩(子视图)。
要从广告界面 push,自然广告界面是一个控制器了。 提升广告界面的层级,才可以。
这里提升为 window 。然后就是切换展示的窗口了,通过系统单例 AppDelegate , [delegate.window makeKeyAndVisible];
如果使用的是控制器, 单 window (就是系统默认创建的), 切换就是 [UIApplication sharedApplication].keyWindow.rootViewController = ...
两点考虑:
1, 希望启动的时候首页早加载,就必须给首页一个 window 容器。
如果使用的是控制器, 从广告到首页,切换即重新创建。
2,可以在内存上复用。首页转登录,登录再转首页
之前项目用的是切换 keyWindow 的 rootViewController, 然后首页就丢了,拿不到。登录逻辑中,新建一个,觉得有点可惜。 使用多 window , 通过系统单例 (AppDelegate *)UIApplication.sharedApplication.delegate , 拿回首页,可以在内存上复用。
- (void)backToWindow{
AppDelegate * delegate = (AppDelegate *)UIApplication.sharedApplication.delegate;
[delegate.window makeKeyAndVisible];
}
复制代码
项目中采用了三个 window, 一个主流程,一个广告, 一个登录, KeyAndVisible 的是广告 window.
这里没有先将图片异步下载到本地,并保存图片名,下次呈现。
这里采用网络请求广告接口获取图片地址,然后加载图片的方式。立即呈现。所以一定要先放一下广告页。
怎么办?
就要延长启动时间了。
因为要等一个网络请求(网络请求广告接口),失败了,就进主界面。 成功了,接着请求图片(使用了两级缓存)
延长启动时间的时候,不能影响体验,不能被系统的 daemon 干掉。 就要用 trick 了。 根控制器是广告控制器。
self.adWindow.rootViewController = [[UINavigationController alloc] initWithRootViewController: [[AdvertiseViewController alloc] init]];
广告控制器的背景图,来一个占位图,就是启动图。
( 项目原因,广告都是实时请求。不是市面上的异步缓存,下次使用。 华新镇风味)
@interface AppDelegate // 主流程 @property (strong, nonatomic) UIWindow *window; // 广告 @property (strong, nonatomic) UIWindow *adWindow; // 登录 @property (strong, nonatomic) UIWindow *loginWindow; 复制代码
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] init];
self.window.frame = [UIScreen mainScreen].bounds;
FrontTabBarController * tabBarController = [[FrontTabBarController alloc] init];
tabBarController.view.backgroundColor = UIColor.redColor;
self.window.rootViewController = tabBarController;
self.adWindow = [[UIWindow alloc] init];
self.adWindow.frame = [UIScreen mainScreen].bounds;
self.adWindow.rootViewController = [[UINavigationController alloc] initWithRootViewController: [[AdvertiseViewController alloc] init]];;
[self.adWindow makeKeyAndVisible];
return YES;
}
复制代码
注意事项:
需要在 Target 的 General 选项卡中, 指定 Main Interface 为空。 建议删除 main.storyboard.
因为启动的时候切换 window, 就不能走 main.storyboard 了.
缺点:
1, 没有转场动画 transition。 退出广告界面,刷的一下出现了主界面,没有 pop.
2, 内存管理, 因为用户看到的 window 只有一个。 广告业务处理完后,切换回首页 window, 就应该释放广告 window. ( 广告 window 是 appDelegate 的属性,appDelegate 是单例, 所以 appDelegate 的广告 window 属性,初始化后,会一直都存在) 在这个时机写, appDelegate.adWindow = nil , 就会黑光一闪。 这肯定是不行的。 需要在之后找地方释放,代码会乱一些。
产品说:不要这种:
iOS 启动广告界面,一般是在 window 上添加子视图。
UIWindow *window = [UIApplication sharedApplication].delegate.window;
[window addSubview: self];
复制代码
广告界面就是首页 rootViewController ( 或者其子 Controller )上面的遮罩。点击广告页,一般是通知首页的 topViewController push 出广告的内容控制器。
搜到的 App 启动加载广告页面思路都这么写。这篇不错。
这种思路挺好的,一般的广告界面的 link 是 deep link, 与 app 强交互,先把整个 app 的框架(首页)加载出来,进入业务层的世界。
大方:
看了一下喜马拉雅的效果,也觉得挺好的。
华新镇的风味.
相关代码: github.com/BoxDengJZ/s…
其他技术点:
可以网络请求异步发起,下次使用,AFNetworking 的事情。
图片缓存策略,SDWebImage 的事情。
倒计时功能, timer 。 广告界面的图片上, 加手势跳转。
未实现的思路:
(设想过,延长系统的启动时间,开一条新的线程出来,进行网络请求,在其回调中通知主线程继续 。NaN )
以上所述就是小编给大家介绍的《iOS 启动广告页思路》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Windows VxDs and Device Drivers, Second Edition
Karen Hazzah / CMP / 1996-01-12 / USD 54.95
Software developer and author Karen Hazzah expands her original treatise on device drivers in the second edition of "Writing Windows VxDs and Device Drivers." The book and companion disk include the a......一起来看看 《Writing Windows VxDs and Device Drivers, Second Edition》 这本书的介绍吧!
HTML 编码/解码
HTML 编码/解码
MD5 加密
MD5 加密工具