麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 系統(tǒng) > iOS > 正文

詳解iOS項(xiàng)目基本框架搭建

2019-10-21 18:41:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

項(xiàng)目開(kāi)發(fā)過(guò)程中,在完成iOS項(xiàng)目——項(xiàng)目開(kāi)發(fā)環(huán)境搭建之后,我們首先需要考慮的就是我們的項(xiàng)目的整體框架與導(dǎo)航架構(gòu)設(shè)計(jì),然后在這個(gè)基礎(chǔ)上考慮功能模塊的完成。

一 導(dǎo)航架構(gòu)設(shè)計(jì)

一款A(yù)pp的導(dǎo)航架構(gòu)設(shè)計(jì)應(yīng)該是符合人們的操作慣性和方便操作的特點(diǎn),也應(yīng)該在交互上更加合理和人性化。根據(jù)項(xiàng)目功能和定位不同,不同的App的導(dǎo)航設(shè)計(jì)應(yīng)該采用不同的技術(shù)框架,目前比較常見(jiàn)的導(dǎo)航框架主要有標(biāo)簽式、列表式、矩陣式三大類,如下圖。

iOS,基本框架

目前資訊新聞?lì)惖囊苿?dòng)端項(xiàng)目的主流App框架基本都是標(biāo)簽式的,這種類型的導(dǎo)航設(shè)計(jì)技術(shù)上基本上都是通過(guò)TabBar + NavigationController框架進(jìn)行搭建完成,大家經(jīng)常使用到的微博、今日頭條等都是采用TabBar + NavigationController這樣的框架。TabBar + NavigationController就是在應(yīng)該TabBar上添加itemBar,每一個(gè)itemBar都是一個(gè)獨(dú)立的模塊,并且每一個(gè)itemBar都對(duì)應(yīng)一個(gè)NavigationController。因?yàn)槊恳粋€(gè)itemBar的導(dǎo)航器都不一樣,所以應(yīng)該是先有TabBar 再有NavigationController。

iOS,基本框架

我們的項(xiàng)目也屬于資訊類,所以我們的項(xiàng)目的框架也是采用TabBar + NavigationController進(jìn)行搭建。今天我們的主要任務(wù)就是搭建我們TabBar,如果采用系統(tǒng)自帶的UITabBarController(官網(wǎng)文檔戳這里),在使用過(guò)程有一下幾點(diǎn)需要注意:

每一個(gè)barItem都必須對(duì)應(yīng)一個(gè)ViewController,可以是一般的ViewController,也可以是UINavigationController barItem對(duì)應(yīng)的ViewController或UINavigationController的frame如果自定義設(shè)置了,注意不要遮擋最下面的TabBar條 barItem的順序與添加到UITabBarController的順序保持一致當(dāng)添加的barItem個(gè)數(shù) <= 5個(gè)時(shí),均勻分布在最下面的bar條上,如上圖所示的4個(gè)當(dāng)添加的barItem個(gè)數(shù) > 5個(gè)時(shí),會(huì)只顯示前四個(gè)添加的barItem,然后加上一個(gè)【more】,點(diǎn)擊【more】彈出一個(gè)列表可選,并且列表的右上角有一個(gè)【edit】按鈕,點(diǎn)擊之后可以調(diào)整barItem的顯示順序,如下圖所示,所以TabBar + NavigationController框架下的barItem個(gè)數(shù)最好不要超過(guò)5個(gè),否則用戶體驗(yàn)不是很好

iOS,基本框架    

iOS,基本框架

添加itemBar對(duì)應(yīng)的ViewController的方法有兩種:一是使用UITabBarController的 setViewControllers: 方法設(shè)置;二是用UIViewController的 addChildViewController: 方法添加子視圖,也可以實(shí)現(xiàn)添加到tabBar的功能,但是這種方法對(duì)于barItem個(gè)數(shù) > 5的時(shí)候,只會(huì)顯示前五個(gè),剩下的不會(huì)出現(xiàn)時(shí)出來(lái),也沒(méi)有【more】按鈕可以選擇。

示例代碼如下,自定義一個(gè)TabBarController繼承自UITabBarController,然后重寫其 viewDidLoad 方法添加子視圖和標(biāo)簽: 

@implementation XMGTabBarController- (void)viewDidLoad {  [super viewDidLoad];    //添加4個(gè)item bar  UITableViewController *vc0 = [[UITableViewController alloc] init];  vc0.view.backgroundColor = [UIColor redColor];  vc0.tabBarItem.title = @"精華";  vc0.tabBarItem.image = [UIImage imageNamed:@"tabBar_essence_icon"];  vc0.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];  [self addChildViewController:vc0];    UIViewController *vc1 = [[UIViewController alloc] init];  vc1.view.backgroundColor = [UIColor blueColor];  vc1.tabBarItem.title = @"新帖";  vc1.tabBarItem.image = [UIImage imageNamed:@"tabBar_new_icon"];  vc1.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_new_click_icon"];  [self addChildViewController:vc1];    UITableViewController *vc2 = [[UITableViewController alloc] init];  vc2.view.backgroundColor = [UIColor greenColor];  vc2.tabBarItem.title = @"關(guān)注";  vc2.tabBarItem.image = [UIImage imageNamed:@"tabBar_friendTrends_icon"];  vc2.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_friendTrends_click_icon"];  [self addChildViewController:vc2];    UIViewController *vc3 = [[UIViewController alloc] init];  vc3.view.backgroundColor = [UIColor grayColor];  vc3.tabBarItem.title = @"我";  vc3.tabBarItem.image = [UIImage imageNamed:@"tabBar_me_icon"];  vc3.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_me_click_icon"];  [self addChildViewController:vc3];   //下面的方法也是可以的,推薦使用下面的方法//  [self addChildViewController:@[vc0,vc1,vc2,vc3]];  }

二 開(kāi)發(fā)過(guò)程中注意代碼重構(gòu)

 在開(kāi)發(fā)過(guò)程中,我們最好不要重復(fù)寫相同的代碼,因此,在開(kāi)發(fā)過(guò)程中,我們需要對(duì)我們的代碼進(jìn)行重構(gòu)和簡(jiǎn)化,主要原則是盡量保持一個(gè)方法實(shí)現(xiàn)一個(gè)功能,然后盡量不寫重復(fù)的代碼,精簡(jiǎn)邏輯。在我們前面添tabBar item的代碼中就存在大量重復(fù)性的代碼,所以我們需要對(duì)其進(jìn)行重構(gòu),將重復(fù)性的代碼進(jìn)行抽取,將不同的內(nèi)容設(shè)置成參數(shù)進(jìn)行自定義設(shè)置,重構(gòu)后的邏輯如下:

@implementation XMGTabBarController- (void)viewDidLoad {  [super viewDidLoad];    /**** 添加子控制器 ****/  [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"精華" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];  [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"新帖" image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];  [self setupOneChildViewController:[[UIViewController alloc] init] title:@"關(guān)注" image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];  [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"我" image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];}/** * 初始化一個(gè)子控制器 * * @param vc      子控制器 * @param title     標(biāo)題 * @param image     圖標(biāo) * @param selectedImage 選中的圖標(biāo) */- (void)setupOneChildViewController:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{  vc.view.backgroundColor = [UIColor redColor];  vc.tabBarItem.title = title;  vc.tabBarItem.image = [UIImage imageNamed:image];  vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];  [self addChildViewController:vc];}@end

三 UITabBarItem設(shè)置 

在iOS開(kāi)發(fā)過(guò)程中,系統(tǒng)自帶的空間有時(shí)候會(huì)將有些圖片顯示出來(lái)時(shí)自動(dòng)渲染成藍(lán)色,例如自帶的TabBarItem在選中時(shí)的圖片,還有設(shè)置UIButtonTypeSystem樣式時(shí)按鈕的圖片,這時(shí)候系統(tǒng)都會(huì)自動(dòng)渲染成藍(lán)色。

vc.tabBarItem.selectedImage = image;UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];[btn setImage:image forState:UIControlStateNormal];
3.1 image的渲染問(wèn)題  

我們?cè)陂_(kāi)發(fā)過(guò)程中有時(shí)候并不需要這種渲染,只希望開(kāi)發(fā)的App按我們?cè)O(shè)定的圖片進(jìn)行顯示就好了,這是我們就需要對(duì)圖片進(jìn)行禁止渲染的設(shè)定和操作。有兩種解決方案:

再次產(chǎn)生一張不會(huì)進(jìn)行渲染的圖片

// 加載圖片UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];// 產(chǎn)生一張不會(huì)進(jìn)行自動(dòng)渲染的圖片UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];vc.tabBarItem.selectedImage = selectedImage;
直接在xcassets文件中配置圖片不被渲染

iOS,基本框架

3.2 設(shè)置TabBarItem的文字屬性

在上述我們隊(duì)圖片修改之后,雖然tabBarItem的圖片可以完全按照我們?cè)O(shè)定的圖片進(jìn)行顯示,但是 在開(kāi)發(fā)過(guò)程中,我們很多時(shí)候還需要對(duì)tabBarItem的標(biāo)題的字體、字號(hào)等文字屬性進(jìn)行設(shè)定。要設(shè)定tabBarItem的文字屬性,我們也有兩種解決方案:

直接設(shè)置每一個(gè)tabBarItem對(duì)象

// 普通狀態(tài)下的文字屬性NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];[vc.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];// 選中狀態(tài)下的文字屬性NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];[vc.tabBarItem setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
需要注意的是:
// 字典中用到的key1.iOS7之前(在UIStringDrawing.h中可以找到)- 比如UITextAttributeFont/UITextAttributeTextColor- 規(guī)律:UITextAttributeXXX2.iOS7開(kāi)始(在NSAttributedString.h中可以找到)- 比如NSFontAttributeName/NSForegroundColorAttributeName- 規(guī)律:NSXXXAttributeName
通過(guò)UITabBarItem的appearance對(duì)象統(tǒng)一設(shè)置
/**** 設(shè)置所有UITabBarItem的文字屬性 ****/UITabBarItem *item = [UITabBarItem appearance];// 普通狀態(tài)下的文字屬性NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];// 選中狀態(tài)下的文字屬性NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
3.3 UIAppearance

只要一個(gè)類遵守UIAppearance,就能獲得全局的外觀,UIview都可以獲取所有的外觀,我們可以獲取所有的tabBarItem外觀標(biāo)識(shí),但是,一般不用下面這種,因?yàn)橄旅孢@種方法獲取的是全局的所有tabBarItem外觀標(biāo)識(shí),我們?cè)陂_(kāi)發(fā)時(shí),一般都是自己負(fù)責(zé)自己開(kāi)發(fā)的部分,所以推薦使用下面第二種方法,只獲取當(dāng)前類的tabBarItem外觀標(biāo)識(shí)。

//獲取全局的tabBarItem外觀標(biāo)識(shí)UITabBarItem *item = [UITabBarItem appearance];
//獲取當(dāng)前這個(gè)類下面的所有tabBarItemUITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil]
appearance使用注意:一定要在控件顯示之前設(shè)置才有用,一般會(huì)放在+ (void)load方法中而不放在+(void)initialize中,因?yàn)? (void)load方法只會(huì)調(diào)用一次,+(void)initialize可能會(huì)調(diào)用多次,使用時(shí)還需要判斷。

load方法:加載類的時(shí)候調(diào)用,類在什么時(shí)候加載呢?程序一起動(dòng)就調(diào)用load方法 Initialize方法:初始化類,當(dāng)?shù)谝淮问褂眠@個(gè)類或者子類的時(shí)候調(diào)用 viewdidload方法:當(dāng)viewcontroller第一次即將顯示的時(shí)候加載。viewController都是懶加載,即都是在即將顯示出來(lái)時(shí)才加載viewdidLoad,但是只有 tabbarcontroller是在一創(chuàng)建控制器的時(shí)候就進(jìn)行加載viewdidLoad。

四 pch文件的定義

PCH文件(Precompile Prefix Header File),也就是預(yù)編譯頭文件,其作用就是,方便你一次性導(dǎo)入在多個(gè)文件中同時(shí)用到的頭文件、宏或者URL地址等(全局使用),可以有效的幫你節(jié)約時(shí)間,提高開(kāi)發(fā)效率。但是,自從Xcode 5之后,這個(gè)文件默認(rèn)就不再提供了,如果你還想繼續(xù)使用的話,需要手動(dòng)創(chuàng)建并配置。至于為什么默認(rèn)不再提供,可能是出于提高編譯效率方面的考慮,畢竟預(yù)編譯也會(huì)提高Build的時(shí)間。

具體如何創(chuàng)建和配置PCH文件詳情可以參見(jiàn):ios中pch文件的創(chuàng)建與配置

下面是在編寫PCH文件需要注意的一些情況: 

#ifndef PrefixHeader_pch#define PrefixHeader_pch/*** 如果希望某些內(nèi)容能拷貝到任何源代碼文件(OC/C/C++等), 那么就不要寫在#ifdef __OBJC__和#endif之間 ***//***** 在#ifdef __OBJC__和#endif之間的內(nèi)容, 只會(huì)拷貝到OC源代碼文件中, 不會(huì)拷貝到其他語(yǔ)言的源代碼文件中 *****/#ifdef __OBJC__#endif/***** 在#ifdef __OBJC__和#endif之間的內(nèi)容, 只會(huì)拷貝到OC源代碼文件中, 不會(huì)拷貝到其他語(yǔ)言的源代碼文件中 *****/#endif

五 在Build Setting中配置宏 

宏定義除了在類中用#define進(jìn)行定義之外,在iOS開(kāi)發(fā)過(guò)程中,我們還可以通過(guò)在Build Setting中進(jìn)行配置宏,而在Build Setting中定義的宏在項(xiàng)目中會(huì)找不到,就是我們通過(guò)【command】+【鼠標(biāo)單擊】會(huì)顯示一個(gè)【?】,無(wú)法跳到對(duì)應(yīng)定義的位置,這時(shí)候可能就是配置在Build Setting中,例如我們經(jīng)常見(jiàn)到的宏 DEBUG 就配置在配置在Build Setting中。

iOS,基本框架

注意點(diǎn):Build Setting中配置的宏的名字不能全部是小寫字母,如果宏的名字全部是小寫, 會(huì)出現(xiàn)以下錯(cuò)誤 

iOS,基本框架

 

注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人精品一区在线播放 | 免费观看视频网站 | 久久久久久久久国产 | 5xsq在线视频 | 成人毛片在线免费看 | 亚州精品天堂中文字幕 | 久久伊人国产精品 | av免费在线观看免费 | 免费久久久久 | 逼特逼视频在线观看 | 18欧美性xxxx极品hd | 亚洲二区三区在线 | 91在线视频在线观看 | 亚洲国产精品久久久久婷婷老年 | 最新av在线免费观看 | 久久av免费 | 麻豆小视频在线观看 | 国产精品视频久久久 | 一级在线观看视频 | 亚洲福利视频52 | 亚洲午夜免费电影 | 黄片毛片一级 | 中文字幕天堂在线 | 欧美激情精品久久久久 | 黄色伊人网站 | 国产超碰人人做人人爱ⅴa 国产精品久久久久久久hd | 91av在线免费视频 | 伦一区二区三区中文字幕v亚洲 | 久久精品99国产国产精 | 亚洲精品永久视频 | 一区二区网 | 亚洲国产精品一区二区精品 | 国产一级毛片网站 | 特级无码毛片免费视频尤物 | xp123精品视频 | 国产69精品福利视频 | 91av在线影院| 国产四区 | 精品国产一区二区亚洲人成毛片 | 黄色免费小网站 | 国产精品一区久久久久 |