亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解iOS項目基本框架搭建

 更新時間:2018年02月08日 16:01:26   作者:mukekeheart  
本篇文章給讀者們詳細(xì)分析了iOS項目基本框架搭建的過程的注意點,對此有需要的朋友學(xué)習(xí)參考下。

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

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

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

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

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

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

    

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

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

@implementation XMGTabBarController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  //添加4個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]];
  
}

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

 在開發(fā)過程中,我們最好不要重復(fù)寫相同的代碼,因此,在開發(fā)過程中,我們需要對我們的代碼進(jìn)行重構(gòu)和簡化,主要原則是盡量保持一個方法實現(xiàn)一個功能,然后盡量不寫重復(fù)的代碼,精簡邏輯。在我們前面添tabBar item的代碼中就存在大量重復(fù)性的代碼,所以我們需要對其進(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"];
}

/**
 * 初始化一個子控制器
 *
 * @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開發(fā)過程中,系統(tǒng)自帶的空間有時候會將有些圖片顯示出來時自動渲染成藍(lán)色,例如自帶的TabBarItem在選中時的圖片,還有設(shè)置UIButtonTypeSystem樣式時按鈕的圖片,這時候系統(tǒng)都會自動渲染成藍(lán)色。

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

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

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

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

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

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

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

// 普通狀態(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];
需要注意的是:
// 字典中用到的key
1.iOS7之前(在UIStringDrawing.h中可以找到)
- 比如UITextAttributeFont\UITextAttributeTextColor
- 規(guī)律:UITextAttributeXXX
2.iOS7開始(在NSAttributedString.h中可以找到)
- 比如NSFontAttributeName\NSForegroundColorAttributeName
- 規(guī)律:NSXXXAttributeName
通過UITabBarItem的appearance對象統(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

只要一個類遵守UIAppearance,就能獲得全局的外觀,UIview都可以獲取所有的外觀,我們可以獲取所有的tabBarItem外觀標(biāo)識,但是,一般不用下面這種,因為下面這種方法獲取的是全局的所有tabBarItem外觀標(biāo)識,我們在開發(fā)時,一般都是自己負(fù)責(zé)自己開發(fā)的部分,所以推薦使用下面第二種方法,只獲取當(dāng)前類的tabBarItem外觀標(biāo)識。

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

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

四 pch文件的定義

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

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

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

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

五 在Build Setting中配置宏 

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

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

相關(guān)文章

  • iOS如何優(yōu)雅地實現(xiàn)序列動畫詳解

    iOS如何優(yōu)雅地實現(xiàn)序列動畫詳解

    這篇文章主要給大家介紹了關(guān)于iOS如何優(yōu)雅地實現(xiàn)序列動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • iOS App中實現(xiàn)播放音效和音樂功能的簡單示例

    iOS App中實現(xiàn)播放音效和音樂功能的簡單示例

    這篇文章主要介紹了iOS App中實現(xiàn)播放音效和音樂功能的簡單示例,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-03-03
  • 詳解iOS視頻播放方式

    詳解iOS視頻播放方式

    本篇文章給大家詳細(xì)講述了詳解iOS視頻播放方式以及第三方開元播放軟件的使用,學(xué)習(xí)下吧。
    2017-12-12
  • iOS實現(xiàn)秒殺活動倒計時

    iOS實現(xiàn)秒殺活動倒計時

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)秒殺活動倒計時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • iOS動畫解析之支付寶支付打鉤動畫的實現(xiàn)方法

    iOS動畫解析之支付寶支付打鉤動畫的實現(xiàn)方法

    支付寶支付打鉤動畫相信對大家來說都不陌生,這篇文章主要給大家介紹了關(guān)于iOS動畫解析之支付寶支付動畫的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 使用ARM匯編破解iOS程序基礎(chǔ)知識分享

    使用ARM匯編破解iOS程序基礎(chǔ)知識分享

    最近對iOS逆向工程很感興趣。但查到的資料中都涉及到有ARM匯編,但都只是很泛地用到,并沒有對iOS上的ARM匯編進(jìn)行比較詳細(xì)的講解。因此,經(jīng)過一系列的學(xué)習(xí)對iOS下的ARM有了一定的理解。在此打算用幾篇文字記錄下來, 限于本人水平有限,如有錯誤請不吝賜教。
    2015-11-11
  • ios基礎(chǔ)教程之常見的數(shù)組使用方法

    ios基礎(chǔ)教程之常見的數(shù)組使用方法

    這篇文章主要給大家介紹了關(guān)于ios基礎(chǔ)教程之常見的數(shù)組使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 仿iOS圖標(biāo)抖動

    仿iOS圖標(biāo)抖動

    最近閑來無聊,研究了一下IPhone桌面圖標(biāo)的抖動,網(wǎng)上有一個類似的事例,但是我看來效果實在不佳,自己也來寫一個玩玩,有需要的小伙伴可以參考下。
    2015-05-05
  • Objective-C中關(guān)于實例所占內(nèi)存的大小詳解

    Objective-C中關(guān)于實例所占內(nèi)存的大小詳解

    這篇文章主要給大家介紹了關(guān)于Objective-C中實例所占內(nèi)存的大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • iOS實現(xiàn)轉(zhuǎn)場動畫的3種方法示例

    iOS實現(xiàn)轉(zhuǎn)場動畫的3種方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實現(xiàn)轉(zhuǎn)場動畫的3種方法,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論