iOS開發(fā)之路--微博新特性頁面
BeyondAppDelegate.m
// // BeyondAppDelegate.m // 20_帥哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondAppDelegate.h" #import "BeyondViewController.h" #import "NewFeatureViewController.h" #import "OauthViewController.h" #define kVersionCodeKey (NSString *)kCFBundleVersionKey @implementation BeyondAppDelegate // 應(yīng)用最先執(zhí)行的方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1,創(chuàng)建窗口 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 2,設(shè)置窗口的背景色 self.window.backgroundColor = [UIColor whiteColor]; // 3,調(diào)用自定義方法,判斷是不是第一次使用本版本的app,如果是第一次使用,則將窗口的根控制器設(shè)為了NewFeature控制器,否則 就直接讓主控制器成為了窗口的根控制器 [self versionCodeCheck]; // 4,讓窗口可見 [self.window makeKeyAndVisible]; return YES; } // 自定義方法,判斷是不是第一次使用本版本的app,如果是第一次使用,則將窗口的根控制器設(shè)為了NewFeature控制器,否則 就直接讓主控制器成為了窗口的根控制器 - (void)versionCodeCheck { // 1,使用用戶偏好,從沙盒中取出舊的版本號(hào) NSString *oldVersionCode = [[NSUserDefaults standardUserDefaults] objectForKey:kVersionCodeKey]; NSString *currentVersionCode = [[[NSBundle mainBundle]infoDictionary] objectForKey:kVersionCodeKey]; // 根據(jù)版本號(hào)的比較結(jié)果 進(jìn)入不同的控制器 //[self stepIntoViewController:currentVersionCode oldVersion:oldVersionCode]; //return; #warning block test -===============以下內(nèi)容,和其中調(diào)用的方法,僅用于block調(diào)用測(cè)試 if ([currentVersionCode isEqualToString:oldVersionCode]) { //if(0){ [self enterBeyondVC]; } else { // 關(guān)鍵 ,并且保存版本號(hào) [[NSUserDefaults standardUserDefaults]setObject:currentVersionCode forKey:kVersionCodeKey]; // 進(jìn)入新特性控制器 NewFeatureViewController *newVC = [[NewFeatureViewController alloc]init]; newVC.startBlock = ^(BOOL isSelected){ log(@"%d",isSelected); [self enterBeyondVC]; }; self.window.rootViewController = newVC; } } #warning block test - (void) enterBeyondVC { // 1,如果進(jìn)行過Oauth授權(quán),則直接進(jìn)入主控制器,否則 進(jìn)行Oauth授權(quán)控制器 if (1) { OauthViewController *oauthVC = [[OauthViewController alloc]init]; self.window.rootViewController = oauthVC; return; } // 進(jìn)入主控制器 BeyondViewController *vc =[[BeyondViewController alloc]init]; self.window.rootViewController = vc; } - (void)stepIntoViewController:(NSString *)curVersion oldVersion:(NSString *)oldVersion { // 比較新舊版本號(hào) UIViewController *rootViewController = nil; #warning 測(cè)試新特性的view if ([curVersion isEqualToString:oldVersion]) { // if (0){ // 說明不是第一次運(yùn)行,直接實(shí)例化主控制器,將主控制器設(shè)置為窗口的根控制器 // 進(jìn)入主控制器(主界面之前 先把狀態(tài)欄,恢復(fù)) ios 7 無效 // [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; rootViewController = [[BeyondViewController alloc]init]; } else { // 說明是第一次運(yùn)行,進(jìn)入新特性控制器,將新特性控制器設(shè)置為窗口的根控制器,并且保存版本號(hào) // 進(jìn)入新特性控制器(新特性界面之前 先把狀態(tài)欄,隱藏) ios 7 無效 // [UIApplication sharedApplication].statusBarHidden = YES; // [[UIApplication sharedApplication]setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; rootViewController = [[NewFeatureViewController alloc]init]; // 關(guān)鍵 ,并且保存版本號(hào) [[NSUserDefaults standardUserDefaults]setObject:curVersion forKey:kVersionCodeKey]; } // 設(shè)置窗口的根控制器,為相應(yīng)的控制器 self.window.rootViewController = rootViewController; } @end
NewFeatureViewController.h
// // NewFeatureViewController.h // 20_帥哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // 只使用一次,版本新特性控制器,在第一次運(yùn)行本版本時(shí)啟用 #import <UIKit/UIKit.h> @interface NewFeatureViewController : UIViewController // 定義一個(gè)block作為成員變量,點(diǎn)擊開始按鈕時(shí),初始化主控制器,讓其成為窗口的根控制器 // block用copy @property (nonatomic,copy) void(^startBlock)(BOOL isShare); @end
NewFeatureViewController.m
// // NewFeatureViewController.m // 20_帥哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // 只使用一次,版本新特性控制器,在第一次運(yùn)行本版本時(shí)啟用 /* 寫在前面: 當(dāng)一個(gè)控件不顯示 的時(shí)候,檢查下面三個(gè)屬性: 沒有寬度和高度 x y 坐標(biāo)不正確 沒有添加到父控件中 當(dāng)一個(gè)控制不能點(diǎn)擊的時(shí)候,檢查下面?zhèn)€屬性: 自己的userinteraction = no 父控件的userinteraction = no 控件本身已經(jīng)超出了它所在的控制器范圍 pageController的高度不能更改,那么就可以置高度為0,其他控件同理 4,居中顯示 的標(biāo)準(zhǔn)步驟:先設(shè)置center,再設(shè)置bounds 5,切換按鈕圖片可以通過切換按鈕的狀態(tài)來完成 normal:普通 highlighted : 高亮(人為長按的時(shí)候) disabled :失效(通過代碼控制) selected : 選中 (通過代碼控制) */ #import "NewFeatureViewController.h" #define kPicNum 4 #warning viewSize 要改成kWinSize #define viewSize self.view.bounds.size @interface NewFeatureViewController ()<UIScrollViewDelegate> { // 頁面指示控制器 UIPageControl *_pageControl; // 因?yàn)殚_啟按鈕的點(diǎn)擊事件中需要分享按鈕的選中狀態(tài) UIButton *_shareBtn; } @end @implementation NewFeatureViewController - (BOOL)prefersStatusBarHidden { // 在LoadView之前 還要先 NSLog(@"prefers bar hidden"); return YES; } - (void)loadView { NSLog(@"load view"); // 新特性,讓imageView成為控制器的view,然后才再ImageView上面添加一層scrollView UIImageView *imgView = [[UIImageView alloc]init]; // 設(shè)置控制器view(即imgView)的尺寸為全屏 imgView.frame = [UIScreen mainScreen].bounds; NSLog(@"%@",NSStringFromCGRect(imgView.frame)); // 使用分類中的方法,如果是iphone5,加載 -568h的圖片 imgView.image = [UIImage fullScrennImageNamed:@"new_feature_background.png"]; // 讓控制器的view可以與用戶交互 imgView.userInteractionEnabled = YES; // 直接讓imgeView成為控制器的view self.view = imgView; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"view did load "); // 1,調(diào)用自定義方法,加載UIScrollView,并且批量添加UIImageView,每個(gè)ImageView中放一張圖片 [self addUIScrollView]; // 2,調(diào)用自定義方法,加載UIPageControl [self addUIPageControl]; } // 自定義方法,加載UIScrollView,并且批量添加UIImageView,每個(gè)ImageView中放一張圖片 - (void) addUIScrollView { // 1.加載UIScrollView,并且批量添加UIImageView,每個(gè)ImageView中放一張圖片 UIScrollView *scrollView = [[UIScrollView alloc] init]; // 顯示的可視區(qū)域大小 scrollView.frame = self.view.bounds; // 水平滾動(dòng)條 scrollView.showsHorizontalScrollIndicator = NO; // 按可視區(qū)域進(jìn)行分頁 scrollView.pagingEnabled = YES; // 滾動(dòng)的范圍 scrollView.contentSize = CGSizeMake(kPicNum * viewSize.width, 0); // 代理 可以監(jiān)聽滾動(dòng)的各類事件 scrollView.delegate = self; // 添加到self.view即ImageView [self.view addSubview:scrollView]; // 2,根據(jù)索引添加kPicNum張圖片排列而成的kPicNum個(gè)imageView到scrollView里面 for (int i = 0; i<kPicNum; i++) { [self addImageViewToScrollView:scrollView atIndex:i]; } } // 自定義方法,加載UIPageControl - (void) addUIPageControl { // 1,加載UIPageControl _pageControl = [[UIPageControl alloc] init]; // 居中最好是先設(shè)置center,再設(shè)置bounds _pageControl.center = CGPointMake(viewSize.width * 0.5, viewSize.height * 0.95); _pageControl.bounds = CGRectMake(0, 0, 100, 0); // 設(shè)置總頁數(shù) _pageControl.numberOfPages = kPicNum; // 重點(diǎn)~從圖片中加載顏色 默認(rèn)顏色和當(dāng)前頁的顏色 _pageControl.pageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"new_feature_pagecontrol_point.png"]]; _pageControl.currentPageIndicatorTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"new_feature_pagecontrol_checked_point.png"]]; // 禁止默認(rèn)的交互事件 _pageControl.userInteractionEnabled = NO; // 添加到self.view即ImageView [self.view addSubview:_pageControl]; } // scrollView的代理方法,用于動(dòng)態(tài)控制PageControl的當(dāng)前圓點(diǎn),滾動(dòng)減速完畢就會(huì)調(diào)用(即scrollview靜止) - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // 當(dāng)前的第幾頁就是偏移的x除以單張寬度 _pageControl.currentPage = scrollView.contentOffset.x / scrollView.frame.size.width; } // 自定義方法,根據(jù)索引添加kPicNum張圖片排列而成的kPicNum個(gè)imageView到scrollView里面 - (void)addImageViewToScrollView:(UIScrollView *)scrollView atIndex:(int)i { // 1.創(chuàng)建imageview UIImageView *imageView = [[UIImageView alloc] init]; // 因?yàn)槭且粡垙埶脚帕?所以根據(jù)索引計(jì)算 frame ,通過結(jié)構(gòu)體必須強(qiáng)轉(zhuǎn)為CGRect imageView.frame = (CGRect){{i * viewSize.width, 0} , viewSize}; // 2.設(shè)置圖片 NSString *name = [NSString stringWithFormat:@"new_feature_%d.png", i + 1]; // 使用分類中的方法,如果是iphone5,加載 -568h的圖片 imageView.image = [UIImage fullScrennImageNamed:name]; // 3.添加 [scrollView addSubview:imageView]; // 4.如果是最后一張圖片,添加2個(gè)按鈕(分享、開始) if (i == kPicNum - 1) { // 必須讓最后一張imageView可以進(jìn)行點(diǎn)擊,這樣它里面的2個(gè)按鈕才可以點(diǎn)擊 imageView.userInteractionEnabled = YES; // 最后一張圖片頁面,有兩個(gè)按鈕,一個(gè)是開始 [self addStartBtnInImageView:imageView]; // 最后一張圖片頁面,有兩個(gè)按鈕,另一個(gè)是分享微博按鈕,默認(rèn)是選中狀態(tài) [self addShareBtnInImageView:imageView]; } } // 最后一張圖片頁面,有兩個(gè)按鈕,一個(gè)是分享 - (void) addShareBtnInImageView:(UIImageView *)imageView { // 2.1.創(chuàng)建自定義樣式的按鈕 _shareBtn = [UIButton buttonWithType:UIButtonTypeCustom]; // 添加到最后一張imageView里面 [imageView addSubview:_shareBtn]; // 2.2.設(shè)置按鈕背景圖片 // 調(diào)用自己寫的分類方法,設(shè)置按鈕正常和高亮狀態(tài)的背景圖片,并且返回 圖片的尺寸 CGSize shareBtnNormalBgImgSize = [_shareBtn setBtnBgImgForNormalAndSelectedWithName:@"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.監(jiān)聽 [_shareBtn addTarget:self action:@selector(shareBtnClick:) forControlEvents:UIControlEventTouchUpInside]; // 2.5.高亮狀態(tài)下不要改變圖片顏色 _shareBtn.adjustsImageWhenHighlighted = NO; // 2.6.默認(rèn)選中 _shareBtn.selected = YES; } // 分享按鈕點(diǎn)擊事件,只要切換不同的選中狀態(tài),就可以顯示不同的兩張圖片(正常圖片是不勾選,選中狀態(tài)的圖片是勾選) - (void)shareBtnClick:(UIButton *)shareBtn { shareBtn.selected = !shareBtn.isSelected; } // 最后一張圖片頁面,有兩個(gè)按鈕,一個(gè)是開始 - (void) addStartBtnInImageView:(UIImageView *)imageView { // 1.1.創(chuàng)建開啟按鈕 // 使用自定義樣式 UIButton *startBtn = [UIButton buttonWithType:UIButtonTypeCustom]; // 添加到最后一張imageView里面 [imageView addSubview:startBtn]; // 1.2.設(shè)置背景圖片等個(gè)性樣式 // 調(diào)用自己寫的分類方法,設(shè)置按鈕正常和高亮狀態(tài)的背景圖片,并且返回 圖片的尺寸 CGSize startBtnBgImgSize = [startBtn setBtnBgImgForNormalAndHighightedWithName:@"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.監(jiān)聽 [startBtn addTarget:self action:@selector(startBtnClick) forControlEvents:UIControlEventTouchUpInside]; } // 點(diǎn)擊開始按鈕時(shí),調(diào)用block完成,以下功能:初始化主控制器,讓其成為窗口的根控制器 - (void)startBtnClick { // 直接調(diào)用block (即另外一個(gè)類里面的一段代碼來執(zhí)行) if (_startBlock) { _startBlock(_shareBtn.isSelected); } } @end
相關(guān)文章
iOS之Https自簽名證書認(rèn)證及數(shù)據(jù)請(qǐng)求的封裝原理
本篇文章主要介紹了iOS之Https自簽名證書認(rèn)證及數(shù)據(jù)請(qǐng)求的封裝原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02iOS的XMPPFramework簡單介紹(實(shí)現(xiàn)及時(shí)通信)
這篇文章主要介紹了iOS的XMPPFramework簡單介紹(實(shí)現(xiàn)及時(shí)通信),實(shí)現(xiàn)了基于XMPP協(xié)議通信的開發(fā),有需要的朋友可以了解一下。2016-11-11IOS 圖文混排(CoreText.framework)詳解及實(shí)例
這篇文章主要介紹了IOS 圖文混排(CoreText.framework)詳解及實(shí)例的相關(guān)資料,這里對(duì)IOS 的圖文混排進(jìn)行了詳細(xì)介紹,并附代碼實(shí)例,和實(shí)現(xiàn)效果圖,需要的朋友可以參考下2016-11-11iOS實(shí)現(xiàn)高性能簡單易用的星星評(píng)分控件
在做APP時(shí)會(huì)用到星星評(píng)分的一個(gè)視圖,在網(wǎng)上也找到一些相關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)高性能簡單易用的星星評(píng)分控件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2018-03-03詳解iOS學(xué)習(xí)筆記(十七)——文件操作(NSFileManager)
這篇文章主要介紹了詳解iOS學(xué)習(xí)筆記(十七)——文件操作(NSFileManager),具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12iOS應(yīng)用中使用AsyncSocket庫處理Socket通信的用法講解
這篇文章主要介紹了iOS應(yīng)用中使用AsyncSocket庫處理Socket通信的用法講解,AsyncSocket同時(shí)支持TCP和UDP,文中展示了其建立斷開連接及發(fā)送接收消息的操作,very好用,需要的朋友可以參考下2016-05-05