关于APP启动引导页面模块
时间:2016年6月14日
作者:赵锐
模块暴露在外的接口是- (void)showGuideViewWithImages:(NSArray *)images;调用时候需要传入引导页图片的名字数组即可。
class="brush:csharp;gutter:true;">@interface GuideManager : NSObject /** * 实现功能:APP启动引导图 * * @param images 引导图图片的名字数组 */ - (void)showGuideViewWithImages:(NSArray *)images;
注意:调用该方法需要在- (void)viewDidAppear: (BOOL)animated; 中调用。
主要思路是在用户第一次启动的时候存储版本号,之后每次启动页面都和沙盒中存储的版本号进行对比,如果一致则跳过引导图
- (void)showGuideViewWithImages:(NSArray *)images { NSString * key = @"CFBundleShortVersionString"; //获得当前版本号 NSString * versionString = [NSBundle mainBundle].infoDictionary[key]; //获取沙盒中存储的版本号 NSString * sandboxString = [[NSUserDefaults standardUserDefaults] stringForKey:key]; //判断两个版本号是否相等,进而判断是否启动引导图 if (![versionString isEqualToString:sandboxString]&& self.window == nil) { self.images = images; self.pageControl.numberOfPages = images.count; self.window = [UIApplication sharedApplication].keyWindow; [self.window addSubview:self.guideView]; [self.window addSubview:self.pageControl]; //存储当前版本号到沙盒 [[NSUserDefaults standardUserDefaults] setValue:versionString forKey:key]; [[NSUserDefaults standardUserDefaults] synchronize]; } }
在这个模块的功能实现中关于传参有两种方案可以选择,一种是传入图片的路径,另一种是传入图片的名字,由于一般我们用Xcode自带的Assets.xcassets来统一管理图片,而这样管理图片时,默认图片没有加入到buddle中,所以如果采用传入图片路径的方案会导致返回值为nil,所以选择传入图片名称,既可以简化代码,也可以实现功能。
关于如何处理pathForResource返回值为nil可以参考http://blog.chinaunix.net/uid-11121450-id-3460066.html。
1>首先就是外部调用接口的方法,一般常在viewDidLoad方法中调用,但是如果在这里调用启动页的方法会导致引导图片添加失败,因为此时keyWindow为nil,所以添加不上去。
2>没有真正理解keyWindow的含义,keywindow取到的是当前活跃的window而不是视图最底层的window。而且在这里就算是成功添加到底层window上,也会由于最终引导页上边盖着一层view而无法交互。
3>尽量在引导页结束后移除视图的同时进行滞空以防野指针导致奔溃。
- 程序运行截图
关于引导页的具体写法就很简单了 可以用scrollerView或者collectionView,只要在最后加一个button即可,此处就不写了