iOS开发之路--微博新特性页面
BeyondAppDelegate.m
// //BeyondAppDelegate.m //20_帅哥no微博 // //Createdbybeyondon14-8-3. //Copyright(c)2014年com.beyond.Allrightsreserved. // #import"BeyondAppDelegate.h" #import"BeyondViewController.h" #import"NewFeatureViewController.h" #import"OauthViewController.h" #definekVersionCodeKey(NSString*)kCFBundleVersionKey @implementationBeyondAppDelegate //应用最先执行的方法 -(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions { //1,创建窗口 self.window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]]; //2,设置窗口的背景色 self.window.backgroundColor=[UIColorwhiteColor]; //3,调用自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了NewFeature控制器,否则就直接让主控制器成为了窗口的根控制器 [selfversionCodeCheck]; //4,让窗口可见 [self.windowmakeKeyAndVisible]; returnYES; } //自定义方法,判断是不是第一次使用本版本的app,如果是第一次使用,则将窗口的根控制器设为了NewFeature控制器,否则就直接让主控制器成为了窗口的根控制器 -(void)versionCodeCheck { //1,使用用户偏好,从沙盒中取出旧的版本号 NSString*oldVersionCode=[[NSUserDefaultsstandardUserDefaults]objectForKey:kVersionCodeKey]; NSString*currentVersionCode=[[[NSBundlemainBundle]infoDictionary]objectForKey:kVersionCodeKey]; //根据版本号的比较结果进入不同的控制器 //[selfstepIntoViewController:currentVersionCodeoldVersion:oldVersionCode]; //return; #warningblocktest-===============以下内容,和其中调用的方法,仅用于block调用测试 if([currentVersionCodeisEqualToString:oldVersionCode]){ //if(0){ [selfenterBeyondVC]; }else{ //关键,并且保存版本号 [[NSUserDefaultsstandardUserDefaults]setObject:currentVersionCodeforKey:kVersionCodeKey]; //进入新特性控制器 NewFeatureViewController*newVC=[[NewFeatureViewControlleralloc]init]; newVC.startBlock=^(BOOLisSelected){ log(@"%d",isSelected); [selfenterBeyondVC]; }; self.window.rootViewController=newVC; } } #warningblocktest -(void)enterBeyondVC { //1,如果进行过Oauth授权,则直接进入主控制器,否则进行Oauth授权控制器 if(1){ OauthViewController*oauthVC=[[OauthViewControlleralloc]init]; self.window.rootViewController=oauthVC; return; } //进入主控制器 BeyondViewController*vc=[[BeyondViewControlleralloc]init]; self.window.rootViewController=vc; } -(void)stepIntoViewController:(NSString*)curVersionoldVersion:(NSString*)oldVersion { //比较新旧版本号 UIViewController*rootViewController=nil; #warning测试新特性的view if([curVersionisEqualToString:oldVersion]){ //if(0){ //说明不是第一次运行,直接实例化主控制器,将主控制器设置为窗口的根控制器 //进入主控制器(主界面之前先把状态栏,恢复)ios7无效 //[[UIApplicationsharedApplication]setStatusBarHidden:NOwithAnimation:UIStatusBarAnimationFade]; rootViewController=[[BeyondViewControlleralloc]init]; }else{ //说明是第一次运行,进入新特性控制器,将新特性控制器设置为窗口的根控制器,并且保存版本号 //进入新特性控制器(新特性界面之前先把状态栏,隐藏)ios7无效 //[UIApplicationsharedApplication].statusBarHidden=YES; //[[UIApplicationsharedApplication]setStatusBarHidden:YESwithAnimation:UIStatusBarAnimationSlide]; rootViewController=[[NewFeatureViewControlleralloc]init]; //关键,并且保存版本号 [[NSUserDefaultsstandardUserDefaults]setObject:curVersionforKey:kVersionCodeKey]; } //设置窗口的根控制器,为相应的控制器 self.window.rootViewController=rootViewController; } @end
NewFeatureViewController.h
// //NewFeatureViewController.h //20_帅哥no微博 // //Createdbybeyondon14-8-3. //Copyright(c)2014年com.beyond.Allrightsreserved. //只使用一次,版本新特性控制器,在第一次运行本版本时启用 #import<UIKit/UIKit.h> @interfaceNewFeatureViewController:UIViewController //定义一个block作为成员变量,点击开始按钮时,初始化主控制器,让其成为窗口的根控制器 //block用copy @property(nonatomic,copy)void(^startBlock)(BOOLisShare); @end
NewFeatureViewController.m
// //NewFeatureViewController.m //20_帅哥no微博 // //Createdbybeyondon14-8-3. //Copyright(c)2014年com.beyond.Allrightsreserved. //只使用一次,版本新特性控制器,在第一次运行本版本时启用 /* 写在前面: 当一个控件不显示的时候,检查下面三个属性: 没有宽度和高度 xy坐标不正确 没有添加到父控件中 当一个控制不能点击的时候,检查下面个属性: 自己的userinteraction=no 父控件的userinteraction=no 控件本身已经超出了它所在的控制器范围 pageController的高度不能更改,那么就可以置高度为0,其他控件同理 4,居中显示的标准步骤:先设置center,再设置bounds 5,切换按钮图片可以通过切换按钮的状态来完成 normal:普通 highlighted:高亮(人为长按的时候) disabled:失效(通过代码控制) selected:选中(通过代码控制) */ #import"NewFeatureViewController.h" #definekPicNum4 #warningviewSize要改成kWinSize #defineviewSizeself.view.bounds.size @interfaceNewFeatureViewController()<UIScrollViewDelegate> { //页面指示控制器 UIPageControl*_pageControl; //因为开启按钮的点击事件中需要分享按钮的选中状态 UIButton*_shareBtn; } @end @implementationNewFeatureViewController -(BOOL)prefersStatusBarHidden { //在LoadView之前还要先 NSLog(@"prefersbarhidden"); returnYES; } -(void)loadView { NSLog(@"loadview"); //新特性,让imageView成为控制器的view,然后才再ImageView上面添加一层scrollView UIImageView*imgView=[[UIImageViewalloc]init]; //设置控制器view(即imgView)的尺寸为全屏 imgView.frame=[UIScreenmainScreen].bounds; NSLog(@"%@",NSStringFromCGRect(imgView.frame)); //使用分类中的方法,如果是iphone5,加载-568h的图片 imgView.image=[UIImagefullScrennImageNamed:@"new_feature_background.png"]; //让控制器的view可以与用户交互 imgView.userInteractionEnabled=YES; //直接让imgeView成为控制器的view self.view=imgView; } -(void)viewDidLoad { [superviewDidLoad]; NSLog(@"viewdidload"); //1,调用自定义方法,加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片 [selfaddUIScrollView]; //2,调用自定义方法,加载UIPageControl [selfaddUIPageControl]; } //自定义方法,加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片 -(void)addUIScrollView { //1.加载UIScrollView,并且批量添加UIImageView,每个ImageView中放一张图片 UIScrollView*scrollView=[[UIScrollViewalloc]init]; //显示的可视区域大小 scrollView.frame=self.view.bounds; //水平滚动条 scrollView.showsHorizontalScrollIndicator=NO; //按可视区域进行分页 scrollView.pagingEnabled=YES; //滚动的范围 scrollView.contentSize=CGSizeMake(kPicNum*viewSize.width,0); //代理可以监听滚动的各类事件 scrollView.delegate=self; //添加到self.view即ImageView [self.viewaddSubview:scrollView]; //2,根据索引添加kPicNum张图片排列而成的kPicNum个imageView到scrollView里面 for(inti=0;i<kPicNum;i++){ [selfaddImageViewToScrollView:scrollViewatIndex:i]; } } //自定义方法,加载UIPageControl -(void)addUIPageControl { //1,加载UIPageControl _pageControl=[[UIPageControlalloc]init]; //居中最好是先设置center,再设置bounds _pageControl.center=CGPointMake(viewSize.width*0.5,viewSize.height*0.95); _pageControl.bounds=CGRectMake(0,0,100,0); //设置总页数 _pageControl.numberOfPages=kPicNum; //重点~从图片中加载颜色默认颜色和当前页的颜色 _pageControl.pageIndicatorTintColor=[UIColorcolorWithPatternImage:[UIImageimageNamed:@"new_feature_pagecontrol_point.png"]]; _pageControl.currentPageIndicatorTintColor=[UIColorcolorWithPatternImage:[UIImageimageNamed:@"new_feature_pagecontrol_checked_point.png"]]; //禁止默认的交互事件 _pageControl.userInteractionEnabled=NO; //添加到self.view即ImageView [self.viewaddSubview:_pageControl]; } //scrollView的代理方法,用于动态控制PageControl的当前圆点,滚动减速完毕就会调用(即scrollview静止) -(void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView { //当前的第几页就是偏移的x除以单张宽度 _pageControl.currentPage=scrollView.contentOffset.x/scrollView.frame.size.width; } //自定义方法,根据索引添加kPicNum张图片排列而成的kPicNum个imageView到scrollView里面 -(void)addImageViewToScrollView:(UIScrollView*)scrollViewatIndex:(int)i { //1.创建imageview UIImageView*imageView=[[UIImageViewalloc]init]; //因为是一张张水平排列,所以根据索引计算frame,通过结构体必须强转为CGRect imageView.frame=(CGRect){{i*viewSize.width,0},viewSize}; //2.设置图片 NSString*name=[NSStringstringWithFormat:@"new_feature_%d.png",i+1]; //使用分类中的方法,如果是iphone5,加载-568h的图片 imageView.image=[UIImagefullScrennImageNamed:name]; //3.添加 [scrollViewaddSubview:imageView]; //4.如果是最后一张图片,添加2个按钮(分享、开始) if(i==kPicNum-1){ //必须让最后一张imageView可以进行点击,这样它里面的2个按钮才可以点击 imageView.userInteractionEnabled=YES; //最后一张图片页面,有两个按钮,一个是开始 [selfaddStartBtnInImageView:imageView]; //最后一张图片页面,有两个按钮,另一个是分享微博按钮,默认是选中状态 [selfaddShareBtnInImageView:imageView]; } } //最后一张图片页面,有两个按钮,一个是分享 -(void)addShareBtnInImageView:(UIImageView*)imageView { //2.1.创建自定义样式的按钮 _shareBtn=[UIButtonbuttonWithType:UIButtonTypeCustom]; //添加到最后一张imageView里面 [imageViewaddSubview:_shareBtn]; //2.2.设置按钮背景图片 //调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回图片的尺寸 CGSizeshareBtnNormalBgImgSize=[_shareBtnsetBtnBgImgForNormalAndSelectedWithName:@"new_feature_share_false.png"selectedName:@"new_feature_share_true.png"]; //2.3.边框(居中,先center,后bounds) _shareBtn.center=CGPointMake(viewSize.width*0.5,viewSize.height*0.75); //按钮宽高,就按背景图片宽高 _shareBtn.bounds=(CGRect){CGPointZero,shareBtnNormalBgImgSize}; //2.4.监听 [_shareBtnaddTarget:selfaction:@selector(shareBtnClick:)forControlEvents:UIControlEventTouchUpInside]; //2.5.高亮状态下不要改变图片颜色 _shareBtn.adjustsImageWhenHighlighted=NO; //2.6.默认选中 _shareBtn.selected=YES; } //分享按钮点击事件,只要切换不同的选中状态,就可以显示不同的两张图片(正常图片是不勾选,选中状态的图片是勾选) -(void)shareBtnClick:(UIButton*)shareBtn { shareBtn.selected=!shareBtn.isSelected; } //最后一张图片页面,有两个按钮,一个是开始 -(void)addStartBtnInImageView:(UIImageView*)imageView { //1.1.创建开启按钮 //使用自定义样式 UIButton*startBtn=[UIButtonbuttonWithType:UIButtonTypeCustom]; //添加到最后一张imageView里面 [imageViewaddSubview:startBtn]; //1.2.设置背景图片等个性样式 //调用自己写的分类方法,设置按钮正常和高亮状态的背景图片,并且返回图片的尺寸 CGSizestartBtnBgImgSize=[startBtnsetBtnBgImgForNormalAndHighightedWithName:@"new_feature_finish_button.png"]; //1.3.边框 startBtn.center=CGPointMake(viewSize.width*0.5,viewSize.height*0.85); //按钮的宽高与背景图片的宽高一样大 startBtn.bounds=(CGRect){CGPointZero,startBtnBgImgSize}; //1.4.监听 [startBtnaddTarget:selfaction:@selector(startBtnClick)forControlEvents:UIControlEventTouchUpInside]; } //点击开始按钮时,调用block完成,以下功能:初始化主控制器,让其成为窗口的根控制器 -(void)startBtnClick { //直接调用block(即另外一个类里面的一段代码来执行) if(_startBlock){ _startBlock(_shareBtn.isSelected); } } @end