IOS博客项目搭建-05-IOS6和IOS7图片适配
2016-01-25 00:00
561 查看
摘要: 对各个版本的IOS版本进行图片适配,并处理找不到文件的bug和在低版本中某些方法不能用的问题。
一、典型Bug调试
clang: error: no such file or directory: 找不到路径文件,我们可以在Build Setting设置中查找pch中的文件,并修改路径为ItcastWeibo/Classes/Other(其他)/ItcastWeibo-Prefix.pch,然后回车保存。
二、在 ItcastWeibo-Prefix.pch中添加宏,判断是否为IOS7的常量
这里有三种方法处理:
1、在每个子控制器中都进行是否为IOS7的判断方法:
IWTabBarViewController.m文件
2、我们可以看到上边的这种做法不够好,因为以后整个项目的图片都必需做IOS7的适配,如果图片很多就会变的非常冗余,所以,这里做一个小小的改变先,可以在自定义的子控制器方法中添加判断是否为IOS7,如果是,然后对图片路径进行拼接为IOS7的图片。
3、我们再往深考虑下,如果有许多的子控制器方法,每个都需要这样添加判断,是不是很麻烦,所以,这个方法仍然不够好,不是最理想的处理方式,那该如何做呢?
在从IOS7切换到IOS6调试时,遇到一个方法在IOS6中不能用,报错,所以在这里处理一个bug先,
解决方案:
IOS6的界面,现在看起来是不是很挫?
好的,处理完这个bug后,再来处理上边的那个问题:有没有更好的方法处理IOS7的图片兼容?
解决思路:我们应该拦截整个项目加载图片的过程,每传一个图片,进行IOS版本判断,如果是IOS7,则给图片名拼接相关的字符串,如果不是,则不用拼接。
在Other(其他)目录下新建一个Category的子目录,分类文件继承UIImage,并在类文件中写一个判断根据版本返回一个图片名的方法:+(UIImage *)imageWithName:(NSString *)name
UIImage+KY.m代码
将该方法在IWTabBarViewController.m中的setupChildViewController方法中应用
我们可以看出,这样进行封装处理后,代码很简洁,只需要一个方法就可以对图片判断版本选择,将来加载图片就不需要根据设置来拼接图片名了,直接给图片名即可判断是否需要拼接。
一、典型Bug调试
clang: error: no such file or directory: 找不到路径文件,我们可以在Build Setting设置中查找pch中的文件,并修改路径为ItcastWeibo/Classes/Other(其他)/ItcastWeibo-Prefix.pch,然后回车保存。
二、在 ItcastWeibo-Prefix.pch中添加宏,判断是否为IOS7的常量
// 1.判断是否为IOS7 #define IOS7 ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) #endif
这里有三种方法处理:
1、在每个子控制器中都进行是否为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"]; }
2、我们可以看到上边的这种做法不够好,因为以后整个项目的图片都必需做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]; // 添加子控制器 }
3、我们再往深考虑下,如果有许多的子控制器方法,每个都需要这样添加判断,是不是很麻烦,所以,这个方法仍然不够好,不是最理想的处理方式,那该如何做呢?
在从IOS7切换到IOS6调试时,遇到一个方法在IOS6中不能用,报错,所以在这里处理一个bug先,
// 该方法imageWithRenderingMode只能在IOS7中适用 childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
解决方案:
// ===判断是否为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]; // 添加子控制器 }
我们可以看出,这样进行封装处理后,代码很简洁,只需要一个方法就可以对图片判断版本选择,将来加载图片就不需要根据设置来拼接图片名了,直接给图片名即可判断是否需要拼接。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 让网页根据不同IE版本显示不同的内容
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法