IOS博客項目搭建-05-IOS6和IOS7圖片適配

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];  // 添加子控制器
    
}

  

咱們能夠看出,這樣進行封裝處理後,代碼很簡潔,只須要一個方法就能夠對圖片判斷版本選擇,未來加載圖片就不須要根據設置來拼接圖片名了,直接給圖片名便可判斷是否須要拼接。

相關文章
相關標籤/搜索