iOSプロジェクトの基本フレームの構築について詳しく説明する。


プロジェクト開発の過程で、iOSプロジェクト――プロジェクト開発環境の構築を完成した後、まず考えなければならないのは、私達のプロジェクトの全体の枠組みとナビゲーションアーキテクチャの設計であり、その上で機能モジュールの完成を考慮することです。
一ナビゲーションアーキテクチャの設計
一つのアプリのナビゲーションアーキテクチャの設計は人々の操作慣性と便利操作の特徴に合うべきであり、対話においてもっと合理的で人間性的であるべきです。プロジェクトの機能と位置付けによって、異なるアプリのナビゲーション設計は異なる技術フレームを採用するべきで、現在比較的によくあるナビゲーションフレームは主にラベル式、リスト式、マトリックス式の三つの種類があります。

現在の情報ニュース類のモバイル端末プロジェクトの主流アプリフレームは基本的にラベル式です。このタイプのナビゲーション設計技術は大体TabBar+NavigationControllerフレームを通して構築されています。みんながよく使うミニブログ、今日のトップなどはTabBar+NavigationControllerというフレームを採用しています。TabBar+NavigationControllerはTabBarにitemBarを追加するべきであり、各itemBarは独立したモジュールであり、各itemBarはNavigationControllerに対応しています。各アイテムバーのナビゲーションは違っていますので、先にTabBarがあります。またNavigationControllerがあります。

私達のプロジェクトも情報部門に属していますので、私達のプロジェクトの枠組みもTabBar+NavigationControllerを使って構築しています。今日の私達の主な任務は私達のTabBarを構築することです。もしシステムが持っているUITTabBar Controllerを採用するなら、使用過程に注意が必要です。
各barItemはView Controllerに対応していなければなりません。一般的なView Controllerでもいいし、UID NavigationController barItemに対応するVieControllerまたはUID NavigationControllerのframeがカスタム設定されていたら、一番下のTabBarバーItemの順番を遮らないように注意してください。UITabBarControllerに添加された順番と一致しています。追加されたbarItemの個数(=5個の場合は、一番下のバーバーバーバーバーバーバーバーバーバーバーバーバーバーに均等に分布します。上の図のように4個の追加されたbarItemの個数>5個だけを表示します。「more」をクリックして、リストの右上に「edit」ボタンがあります。クリックしたらBarItemの表示順序を調整できます。下の図のようにTabBar+NavigationControllerフレームのbarItemの数は5個を超えない方がいいです。そうでないと、ユーザー体験はあまり良くないです。
    

itembor対応のView Controllerを追加する方法は二つあります。一つはUITTabBarControllerを使用する方法です。 set View Controller: メソッド設定;二つ目はUID View Controllerを使っています。 addChild View Controller: 方法はサブビューを追加して、tabBarに追加する機能を実現することができますが、この方法はbarItem個数>5の場合、前の5つだけ表示されます。残りは出現しない時に出てきます。また、「more」ボタンもなく選択できます。
例のコードは以下の通りです。TabBarControllerをカスタマイズしてUITTabBar Controllerから引き継ぎ、それを書き直します。 view DidLoad メソッドにサブビューとラベルを追加します。 

@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 = @"  ";
  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]];
  
}
第二開発過程でコード再構成に注意する。
 開発の過程で、同じコードを繰り返し書かないほうがいいです。だから、開発の過程で、私達はコードの再構成と簡略化が必要です。私達の前にtabBar itemを追加したコードの中には大量の重複性のコードが存在します。だから私達はそれを再構成し、重複性のコードを抽出し、異なる内容をパラメータに設定してカスタマイズして設定します。再構成後のロジックは以下の通りです。

@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:@"  " 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       
 * @param image       
 * @param selectedImage      
 */
- (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設定 
iOSの開発過程では、一部の画像が表示されると自動的に青色に描画される場合があります。例えば、自分のTabBarItemが選択された時の画像、UButton Type Systemスタイルを設定した時のボタンの画像は、自動的に青色に描画されます。

vc.tabBarItem.selectedImage = image;
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setImage:image forState:UIControlStateNormal];
3.1イメージのレンダリング問題
私達は開発中にこのようなレンダリングが必要ではない場合があります。開発したアプリは私達が設定した写真で表示すればいいです。これは私達が写真にレンダリングを禁止する設定と操作が必要です。二つの解決策があります。
再度レンダリングされない画像を生成します。

//     
UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];
//                
UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.selectedImage = selectedImage;
直接xcassetsファイルに画像を配置しても描画されません。

3.2 TabBarItemのテキスト属性を設定します。
上記のように私達のチームの写真を修正した後、tabBarItemの写真は完全に私達の設定した写真によって表示されますが、開発過程でtabBarItemのタイトルのフォント、サイズなどの文字属性を設定する必要があります。tabBarItemの文字属性を設定するには、2つの解決策があります。
各オブジェクトを直接設定します。

//           
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[vc.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];

//           
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[vc.tabBarItem setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
注意したいのは:

//       key
1.iOS7  ( UIStringDrawing.h     )
-   UITextAttributeFont\UITextAttributeTextColor
-   :UITextAttributeXXX
2.iOS7  ( NSAttributedString.h     )
-   NSFontAttributeName\NSForegroundColorAttributeName
-   :NSXXXAttributeName
UITTabBarItemのapearanceオブジェクトで一括設定します。

/****     UITabBarItem      ****/
UITabBarItem *item = [UITabBarItem appearance];
//           
NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
//           
NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
[item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
3.3 UAPpearance
UAPpearanceを守るだけで、全体の外観を獲得できます。UIviewはすべての外観を取得できます。tabBarItemの外観標識を全部取得できます。しかし、以下のような方法は必要ありません。下のような方法でグローバルのすべてのtabBarItemの外観標識を取得します。私達は開発する時、自分で開発した部分を担当します。次の2つの方法を使って、現在のクラスのテーブBarItemの外観表示のみを取得することを推奨します。

//     tabBarItem    
UITabBarItem *item = [UITabBarItem appearance];

//            tabBarItem
UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil]
apparance使用上の注意:必ずコントロールの表示前に設定してください。普通は+(void)load方法に入れます。+(void)initializeに入れないでください。+(void)load方法は一回だけ呼び出すので、+(void)initiazeは何回も呼び出します。使う時はまだ判断が必要です。
ロード方法:クラスをロードする時に呼び出すと、クラスはいつロードされますか?プログラムが起動すると、ロード方法Initializeを呼び出します。初期化クラスは、このクラスまたはサブクラスを初めて使う時にview didlead方法を呼び出します。viewcontrollerが初めて表示される時にロードします。view Controllerはすべて怠惰にロードして、つまりすべて間もなく表示される時やっとview didLoadをロードするので、しかしtabracontrollerだけがコントローラを創建する時view didLoadをロードするのです。
四pchファイルの定義
PCHファイル(Precomple Prefix Header File)、つまりプリコンパイルヘッドファイルの役割は、複数のファイルの中で同時に使用されるヘッダファイル、マクロまたはURLアドレスなどを一度に導入して、有効に時間を節約して、開発効率を向上させることです。しかし、Xcode 5以降、このファイルはデフォルトでは提供されなくなりました。まだ使い続けたいなら、手動で作成して配置する必要があります。なぜデフォルトでは提供されないのかというと、コンパイルの効率を向上させるという考えからかもしれません。
具体的にどのようにPCHファイルを作成して構成するかは、iosのpchファイルの作成と構成を参照してください。
以下はPCHファイルの作成に注意する必要がある場合です。 

#ifndef PrefixHeader_pch
#define PrefixHeader_pch
/***                    (OC\C\C++ ),        #ifdef __OBJC__ #endif   ***/
/*****  #ifdef __OBJC__ #endif     ,      OC      ,                  *****/
#ifdef __OBJC__
#endif
/*****  #ifdef __OBJC__ #endif     ,      OC      ,                  *****/
#endif
5 Build Settingにマクロを設定します。 
マクロ定義は、クラスの中で嗳defineで定義する以外に、iOS開発中にBuild Settingでマクロを設定することもできます。Build Settingで定義されたマクロはプロジェクトの中で見つけられません。つまり、私達は【command】+【マウスクリック】で【?】を表示します。定義された位置にジャンプできませんでした。この場合は、Build Settingに配置されているかもしれません。例えば、私たちがよく見るマクロDEBUGはBuild Settingに配置されています。

注意点:Build Settingに配置されているマクロの名前はすべて小文字ではなく、マクロの名前がすべて小文字であれば、以下のようなエラーが発生します。