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

  

咱们能够看出,这样进行封装处理后,代码很简洁,只须要一个方法就能够对图片判断版本选择,未来加载图片就不须要根据设置来拼接图片名了,直接给图片名便可判断是否须要拼接。

相关文章
相关标签/搜索