视图控件

动态配置Tabbar图标最优解

2018-12-11  本文已影响81人  roc_鹏

最近需要实现动态配置TabbarIcon的需求,主要是针对节假日活动时,由后台配置富有节日元素的图标,我们移动端来替换展示。乍看这个需求很简单,就是从后台读取数据,拿到图片url后替换tabbar图标资源。可是在做的过程中发现还是需要思考一些东西的。下面我们一步步来实现。

实现思路

#pragma mark - 网络请求
- (void)configTabBarIcons{
    if(success){//请求成功
     NSMutableArray *imagesUrlArr;//网络请求获取的icon的url数组
     if(imagesUrlArr.count){ //判断图片url数组是否为空
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
     UIImage *image = [UIImage imageWithData:data];
     NSMutableArray *imagesArr;//存放image的数组
     for (int i = 0; i < itemArray.count; i ++) {//根据item个数遍历替换图片资源
     UITabBarItem * item = itemArray[i];
     item.image=[[UIImage imageNamed:imagesArr[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
     
     }else{//未获取到图片url数组
     //现实默认icon
      for (int i = 0; i < itemArray.count; i ++) {//根据item个数遍历替换图片资源
      UITabBarItem * item = itemArray[i];
    item.image=[[UIImage imageNamed:defImageArr[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    }
   }

   }else{//接口调用失败

    Toast(fail);
   }

}

这个伪代码很丑我真的不想再写了。很明显他根本没有过多考虑多种可能性,比如接口调用时机,调用失败情况,代码性能就更不用提了。我下面就针对上面伪代码进行一次优化。

/**
网络图片存入沙盒并返回(针对tabBarIcon使用)

@param imageUrl 网络图片地址
@return 沙盒图片返回
*/
+ (UIImage *)tabBarItemImageUrl:(NSString *)imageUrl
{
NSArray *stringArr = [imageUrl componentsSeparatedByString:@"/"];
NSString *imageName = stringArr.lastObject;
NSString *name = [[imageName componentsSeparatedByString:@"."] firstObject];
imageName = [NSString stringWithFormat:@"%@@2x.png",name];
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];
NSLog(@"%@",path);

NSString *iconFilePath = [path stringByAppendingPathComponent:@"tabbarIcon"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fullPath = [iconFilePath stringByAppendingPathComponent:imageName];

// 判断文件是否已存在,存在直接读取
if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
NSLog(@"存在了");
return [UIImage imageWithContentsOfFile:fullPath];
}
//获取iconFilePath下文件个数
NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:iconFilePath error:nil];
//超过8个说明icon需要更换清除iconFilePath文件
if (subPathArr.count >= 8) {
[fileManager removeItemAtPath:iconFilePath error:nil];
}
//再从新创建iconFilePath文件
BOOL isDir = NO;
// fileExistsAtPath 判断一个文件或目录是否有效,isDirectory判断是否一个目录
BOOL existed = [fileManager fileExistsAtPath:iconFilePath isDirectory:&isDir];
if ( !(isDir == YES && existed == YES) ) {
// 在 Caches 目录下创建一个 tabbarIcon 目录
[fileManager createDirectoryAtPath:iconFilePath withIntermediateDirectories:YES attributes:nil error:nil];
}

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
UIImage *image = [UIImage imageWithData:data];
// 将image写入沙河
if ( [UIImagePNGRepresentation(image) writeToFile:fullPath atomically:YES]) {
return [UIImage imageWithContentsOfFile:fullPath];

}else
{
return nil;
}
}

使用时直接调用:

item.image=[[UIImage tabBarItemImageUrl:self.imagesUrlArr[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

好了,以上是本人的拙见,如有不足之处还请指出。

上一篇下一篇

猜你喜欢

热点阅读