首页 > 代码库 > iOS开发项目篇—08新版本特性·SrollView

iOS开发项目篇—08新版本特性·SrollView

iOS开发项目篇—08新版本特性

一、简单说明

展示新版本的特性:第一次使用一些应用软件时,展示这个版本的软件的新特性,一般在第一次启动程序的时候显示。

1.什么情况下显示版本新特性:

(1)第一次使用某个软件时(X)

(2)第一次使用某个版本时,显示版本新特性(V)

2.怎么知道这个软件的版本呢?

在plist文件里,bundle version中显示版本号。

3.如何显示版本新特性?

应该在YYAppDelegate.m中进行判断;

如果是第一次使用这个版本,那么就显示版本新特性(设置为window的根控制器),如果不是的话,那么就显示“首页”的控制器。

新建一个控制器,使用UIScore来显示新特性。

4.如何知道是第一次使用这个版本呢?

比较上次的使用情况。把每次使用的软件的版本号存储到沙盒中,当下一次打开软件时,取出上一次保存的版本号,进行比较。

5.代码示例:

YYAppDelegate.m文件中的处理代码:

 1 // 2 //  YYAppDelegate.m 3 // 4  5 #import "YYAppDelegate.h" 6 #import "YYTabBarViewController.h" 7 #import "YYNewfeatureViewController.h" 8  9 @implementation YYAppDelegate10 11 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions12 {13  14    //1.创建窗口15     self.window=[[UIWindow alloc]init];16     self.window.frame=[UIScreen mainScreen].bounds;17     18     //2.设置窗口的根控制器19     //如何知道是否是第一次使用这个版本?可以通过比较上次使用的版本进行判断20     NSString *versionKey=@"CFBundleVersion";21     versionKey=(__bridge NSString *)kCFBundleVersionKey;22     23     //从沙盒中取出上次存储的软件版本号(取出用户上次的使用记录)24     NSUserDefaults *defaults=[[NSUserDefaults alloc]init];25     NSString *lastVersion=[defaults objectForKey:versionKey];26     27     //获得当前打开软件的版本号28     NSString *currentVersion=[NSBundle mainBundle].infoDictionary[versionKey];29     if ([currentVersion isEqualToString:lastVersion]) {//当前版本号==上次使用的版本号30            self.window.rootViewController=[[YYTabBarViewController alloc]init];31 //         self.window.rootViewController=[[YYNewfeatureViewController alloc]init];32     }else{//当前版本号!=上次使用的版本号:显示新版本的特性33            self.window.rootViewController=[[YYNewfeatureViewController alloc]init];34         //存储这个使用的软件版本35         [defaults setObject:currentVersion forKey:versionKey];36         //立刻写入37         [defaults synchronize];38     }39     40     //3.显示窗口(主窗口)41     [self.window makeKeyAndVisible];42     return YES;43 }

代码说明:

(1)比较大小,不能转浮点数,其实只要比较字符串不一样就是新的了。

(2)bundle version在Xcode中的真实类型为CFbundeVersion。

(3)Foundation和core foundation的数据类型是可以相互转换的,在两个框架之间比较安全的转换是桥接转换。

1 NSString *text = @"啊哈哈哈哈";2 3 CFStringRef str = (__bridge CFStringRef)text;4 5 NSString\NSArray\NSDictionary : Foundaiton6 7 CFStringRef\CFArrayRef\CFDictionaryRef :  Core Foundation8 9 // Foundation和Core Foundation的数据类型是可以相互转换的,必须用__bridge关键字进行桥接转换

 

二、新建一个展示新版本特性的控制器

1.导入图片素材

2.新建一个控制器类

 3.实现代码

YYNewfeatureViewController.m文件

  1 //  2 //  YYNewfeatureViewController.m  3 //  4   5 #import "YYNewfeatureViewController.h"  6 #define YYNewfeatureImageCount    4  7 @interface YYNewfeatureViewController ()<UIScrollViewDelegate>  8 @property(nonatomic,strong)UIPageControl *pageControl;  9  10 @end 11  12 @implementation YYNewfeatureViewController 13  14  15 - (void)viewDidLoad 16 { 17     [super viewDidLoad]; 18     //1.添加UIScrollView 19     [self setupScrollView]; 20     //2.添加pageControl 21     [self setupPageControl]; 22 } 23 /** 24  *添加UIScrollVie 25  */ 26 -(void)setupScrollView 27 { 28     //1.添加UIScrollVie 29     //创建 30     UIScrollView *scrollView=[[UIScrollView alloc]init]; 31     //设置frame 32     scrollView.frame=self.view.bounds; 33     //设置代理 34     scrollView.delegate=self; 35     //添加到view 36     [self.view addSubview:scrollView]; 37      38     //2.添加图片 39     //设置每张图片的宽高和scrollView的一致 40     CGFloat imageW=scrollView.width; 41     CGFloat imageH=scrollView.height; 42     //添加四张图片 43     for (int i=0; i<YYNewfeatureImageCount; i++) { 44         //创建ImageView 45         UIImageView *imageView=[[UIImageView alloc]init]; 46         NSString *name=[NSString stringWithFormat:@"new_feature_%d",i+1]; 47 //        if ([UIScreen mainScreen].bounds.size.height==568.0) { 48 //            name=[name stringByAppendingString:@"-568h"]; 49 //        } 50         if (FourInch) {//需要手动去加载4英寸对应的-568h@2x图片 51             name=[name stringByAppendingString:@"-568h"]; 52         } 53         imageView.image=[UIImage imageWithName:name]; 54          55         //把ImageView添加到scrollView上 56         [scrollView addSubview:imageView]; 57          58         //设置imageView的frame 59         imageView.y=0; 60         imageView.width=imageW; 61         imageView.height=imageH; 62         imageView.x=i*imageW; 63     } 64     //设置其他的属性 65     //设置活动范围 66     scrollView.contentSize=CGSizeMake(YYNewfeatureImageCount*imageW, 0); 67     //设置背景颜色 68     scrollView.backgroundColor=YYColor(246, 246, 246); 69     //隐藏水平滚动条 70     scrollView.showsHorizontalScrollIndicator=NO; 71 //    scrollView.pagingEnabled=YES; 72     //去除弹簧效果 73     scrollView.bounces=NO; 74 } 75  76 /** 77  *2.添加pageControl 78  */ 79 -(void)setupPageControl 80 { 81     UIPageControl *pageControl=[[UIPageControl alloc]init]; 82     //设置一共有几页 83     pageControl.numberOfPages=YYNewfeatureImageCount; 84     //设置显示的位置 85     pageControl.centerX=self.view.width*0.5; 86     pageControl.centerY=self.view.height-30; 87     //把pageControl添加到view上 88     [self.view addSubview:pageControl]; 89      90     //设置圆点的颜色 91     //当前页的圆点的颜色 92     pageControl.currentPageIndicatorTintColor=YYColor(253, 98, 42); 93     //其它叶的圆点的颜色 94     pageControl.pageIndicatorTintColor=YYColor(189, 189, 189); 95     self.pageControl=pageControl; 96      97 } 98 #pragma mark-UIScrollViewDelegate 99 -(void)scrollViewDidScroll:(UIScrollView *)scrollView100 {101 //    YYLog(@"scrollViewDidScroll----%f",scrollView.contentOffset.x);102     //拿到浮点数进行四舍五入103     double doublePage=scrollView.contentOffset.x/scrollView.width;104     int intPage=(int)(doublePage + 0.5);105     //设置当前页码106     self.pageControl.currentPage=intPage;107 108 }109 #pragma mark-隐藏状态栏110 -(BOOL)prefersStatusBarHidden111 {112     return YES;113 }114 @end

4.实现细节

(1)设置活动范围 scrollView.contentSize=CGSizeMake(YYNewfeatureImageCount*imageW, 0);

(2)设置背景颜色 scrollView.backgroundColor=YYColor(246, 246, 246);

(3)隐藏水平滚动条 scrollView.showsHorizontalScrollIndicator=NO;

(4)去除弹簧效果scrollView.bounces=NO;

(5)补充:在pch文件中得宏定义

 1 // 2 //  Prefix header 3 // 4 //  The contents of this file are implicitly included at the beginning of every source file. 5 // 6  7 #import <Availability.h> 8  9 #ifndef __IPHONE_5_010 #warning "This project uses features only available in iOS SDK 5.0 and later."11 #endif12 13 #ifdef __OBJC__14     #import <UIKit/UIKit.h>15     #import <Foundation/Foundation.h>16     #import "UIImage+Extension.h"17     #import "UIBarButtonItem+Extension.h"18     #import "UIView+Extension.h"19 20 #ifdef DEBUG // 调试状态, 打开LOG功能21 #define YYLog(...) NSLog(__VA_ARGS__)22 #else // 发布状态, 关闭LOG功能23 #define YYLog(...)24 #endif25 26 // 颜色27 #define YYColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]28 29 // 随机色30 #define YYRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]31 32 // 是否为iOS733 #define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0)34 35 //是否为4英寸36 #define FourInch ([UIScreen mainScreen].bounds.size.height==568.0)37 #endif

5.实现效果

程序启动后的引导(新特性界面)

(1)关于加载图片的说明

当手机屏幕是3.5的时候,自动加载@2x的图片

当手机屏幕是4.0的时候,自动加载-568h@2x的图片

拖入图片素材后,显示如下:

 

但是如果把模拟器调整为4.0英寸时,在程序运行中并没有自动加载-568h@2x的图片。通过下面的图片(home键变成了椭圆)可以看出来。

说明:只有是启动图片的时候才会自动去加载-568h@2x的图片,所以这里需要我们手动去加载。

判断:如果是4英寸的屏幕,那么就加载-568h@2x的图片。

if ([UIScreen mainScreen].bounds.size.height==568.0) {    name=[name stringByAppendingString:@"-568h"];}

在项目中把是否为4英寸的判断定义为一个宏

#define FourInch ([UIScreen mainScreen].bounds.size.height==568.0)

注意:如果一张图片,它下面的标示为Unassigned,说明Xcode5不知道将来这张图片会用在什么地方,不会打包到mainbundle中去,即相当于图片不存在。

 

告诉Xcode图片是有用的,解决方法: