1、典型Bug調試
ui
clang: error: no such file or directory: 找不到路徑文件,咱們能夠在Build Setting設置中查找pch中的文件,並修改路徑爲ItcastWeibo/Classes/Other(其餘)/ItcastWeibo-Prefix.pch,而後回車保存。spa
2、在 ItcastWeibo-Prefix.pch中添加宏,判斷是否爲IOS7的常量調試
// 1.判斷是否爲IOS7 #define IOS7 ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) #endif
這裏有三種方法處理:code
一、在每一個子控制器中都進行是否爲IOS7的判斷方法:繼承
IWTabBarViewController.m文件圖片
// 將全部的初始化自控制器抽出成一個方法,而後在啓動時自動調用 -(void)setupAllChildViewControllers { // 初始化全部的子控制器(首頁,消息,廣場,我)每一個控制器的內容都不同,因此每一個自控制器實現本身的業務邏輯 // 1.首頁 IWHomeViewController *home = [[IWHomeViewController alloc] init]; home.view.backgroundColor = [UIColor redColor]; // 自控制器添加背景色 if(IOS7) { // 自定義的重構的公共方法 [self setupChildViewController:home title:@"首頁" imageName:@"tabbar_home_os7" selectedImageName:@"tabbar_home_selected_os7"]; } else { // 自定義的重構的公共方法 [self setupChildViewController:home title:@"首頁" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"]; }
二、咱們能夠看到上邊的這種作法不夠好,由於之後整個項目的圖片都必需作IOS7的適配,若是圖片不少就會變的很是冗餘,因此,這裏作一個小小的改變先,能夠在自定義的子控制器方法中添加判斷是否爲IOS7,若是是,而後對圖片路徑進行拼接爲IOS7的圖片。字符串
/** *(重構方法)初始化一個子控制器 * * @param childVc 須要初始化的子控制器 * @param title 標題 * @param imageName 圖標 * @param selectedImageName 選中的圖標 * */ -(void)setupChildViewController:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName { // 1.設置控制器的一些屬性 childVc.title = title; // ===判斷是否爲IOS7,若是是則顯示IOS7的圖片=== if(IOS7){ imageName = [imageName stringByAppendingString:@"_os7"]; selectedImageName = [selectedImageName stringByAppendingString:@"_os7"]; } childVc.tabBarItem.image = [UIImage imageNamed:imageName]; childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; // 2.包裝一個導航控制器 UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:childVc]; [self addChildViewController:Nav]; // 添加子控制器 }
三、咱們再往深考慮下,若是有許多的子控制器方法,每一個都須要這樣添加判斷,是否是很麻煩,因此,這個方法仍然不夠好,不是最理想的處理方式,那該如何作呢?string
在從IOS7切換到IOS6調試時,遇到一個方法在IOS6中不能用,報錯,因此在這裏處理一個bug先,it
// 該方法imageWithRenderingMode只能在IOS7中適用 childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
解決方案:io
// ===判斷是否爲IOS7,若是是則顯示IOS7的圖片=== if(IOS7) { imageName = [imageName stringByAppendingString:@"_os7"]; selectedImageName = [selectedImageName stringByAppendingString:@"_os7"]; // 若是爲IOS7不要渲染爲藍色, imageWithRenderingMode,注意:該方法在IOS6中報錯。 childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } else { // IOS6中不須要對選中的圖片進行渲染 childVc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImageName]; } childVc.tabBarItem.image = [UIImage imageNamed:imageName];
IOS6的界面,如今看起來是否是很挫?
好的,處理完這個bug後,再來處理上邊的那個問題:有沒有更好的方法處理IOS7的圖片兼容?
解決思路:咱們應該攔截整個項目加載圖片的過程,每傳一個圖片,進行IOS版本判斷,若是是IOS7,則給圖片名拼接相關的字符串,若是不是,則不用拼接。
在Other(其餘)目錄下新建一個Category的子目錄,分類文件繼承UIImage,並在類文件中寫一個判斷根據版本返回一個圖片名的方法:+(UIImage *)imageWithName:(NSString *)name
UIImage+KY.m代碼
#import "UIImage+KY.h" @implementation UIImage (KY) /** * 加載圖片 * * @param name 圖片名 * */ +(UIImage *)imageWithName:(NSString *)name { if(IOS7){ NSString *newName = [name stringByAppendingString:@"_os7"]; UIImage *image = [UIImage imageNamed:newName]; if(image == nil){ // 沒有_os7後綴的圖片,用原來的圖片名 image = [UIImage imageNamed:name]; } return image; } // 非IOS7 return [UIImage imageNamed:name]; } @end
將該方法在IWTabBarViewController.m中的setupChildViewController方法中應用
/** *(重構方法)初始化一個子控制器 * * @param childVc 須要初始化的子控制器 * @param title 標題 * @param imageName 圖標 * @param selectedImageName 選中的圖標 * */ -(void)setupChildViewController:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName { // 1.設置控制器的一些屬性 childVc.title = title; // 設置圖標 ==== imageWithName 使用 === childVc.tabBarItem.image = [UIImage imageWithName:imageName]; // 設置選中的圖標 if(IOS7) { // 若是爲IOS7不要渲染爲藍色, imageWithRenderingMode,注意:該方法在IOS6中報錯。==== imageWithName 使用 === childVc.tabBarItem.selectedImage = [[UIImage imageWithName:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } else { // IOS6中不須要對選中的圖片進行渲染 childVc.tabBarItem.selectedImage = [UIImage imageWithName:selectedImageName]; } // 2.包裝一個導航控制器 UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:childVc]; [self addChildViewController:Nav]; // 添加子控制器 }
咱們能夠看出,這樣進行封裝處理後,代碼很簡潔,只須要一個方法就能夠對圖片判斷版本選擇,未來加載圖片就不須要根據設置來拼接圖片名了,直接給圖片名便可判斷是否須要拼接。