管理兑现iOS图片等能源文件的热更新化(二):自定义的动态 imageNamed

小编们是一家位于新加坡的网络创业团队,我们的制品是「简书」:
http://jianshu.com ,既有 Web 端,也有 iOS
和Android 的 app,近期早已进入了第陆个年头。

那篇小说,要化解的是,使用3个自定义的 imageNamed 函数来顶替系统的
imageNamed 函数.内部逻辑,将贯通比较论证
关于”合适”的图纸的定义.对iOS加载图片的规则不是很熟识的童鞋,能够重点看那篇.

想必你早已据说过,大家在 2015 年完结了 500 万元人民币的 Pre-A
轮融通资金,并于 2015 实现了数百万英镑的 A
轮融通资金,二〇一七年5月我们恰好实现了4200万人民币B轮融通资金,领投方为君联资本、海纳澳大内罗毕创投基金(SIG)。

不等后缀图片加载的优先级

  • iPhone 7 plus(iOS10.0): sample@3x.png > sample@2x.png >
    sample~iphone.png >sample.png
    其余后缀的图形总是不被加载.

  • iPad Pro 12.9 inch(iOS10.0): sample@2x.png >
    sample~ipad.png > sample.png 别的后缀的图纸总是不被加载.

不同后缀的图片 iPhone 7 plus(iOS10.0) iPad Pro 12.9 inch(iOS10.0)
sample.png 7 8
sample@2x.png 9 10
sample@3x.png 10 0
sample~iphone.png 8 0
sample~iphone@2x.png 0 0
sample~iphone@3x.png 0 0
sample~ipad.png 0 9
sample~ipad@2x.png 0 0

能够运用同名分歧内容的图形来相比观看.优先级从高到低.优先级较高的预先被加载,优先级为0的世代不会被加载.仅以iPhone7 plus 和 GALAXY TabPro为例分析,别的情况可自行.所用验证版本为iOS10,将来不等机型手提式有线电话机和系统大概会有差距.

想协调动手试一下的,可以下载示例:
https://github.com/ios122/ios_assets_hot_update/raw/master/res/ios_assets_hot_update_2.zip
一点都不大,唯有100多K.编写翻译,笔者那儿用的是 Xcode 8.

用作国内压倒元白的优质创作社区,简友们平均每秒揭橥八个评价、为五篇文章点“喜欢”,每两秒有一篇原革新小说诞生。

使用bundle包放置图片等能源文件

管理 1

财富把到2个bundle包中,便于保存财富的目录结构,也利于全部管理与替换.iOS中的bundle包,就三个一个独特的以.bunle结尾的文件夹.示例中,小编利用的是main.bundle.此外,关于bundle保留财富目录结构这几个特点,是react-native中很正视的二个特点,今后您的项目中大概也会必要.要是一味只是从原本
Images.xcassets 迁移代码的话,此处都放于同一层级即可.

我们相信,你的过来,会让简书变得更好。

使用 imageWithContentsOfFile: 加载图片

把图片放到能源文件夹main.bundle后,再加载图片,能够参考上边的代码,那样做的额外的补益正是可以适合减小图片加载的内部存储器占用难点:

NSString * bundlePath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"main.bundle"];
NSBundle * mainBundle = [NSBundle bundleWithPath:bundlePath];
NSString * imgPath = [mainBundle pathForResource:@"sample" ofType:@"png"];
self.sampleImageView.image = [UIImage imageWithContentsOfFile: imgPath];

让我们携手构建三个更不错的「简书」吧,一起接受世界的赞许!

使Nokia @3x 与三星GALAXY Tab @2x 共用同样张图纸

先是是须要展现加载 @3x 的图样:

NSString * imgPath = [mainBundle pathForResource:@"sample@3x" ofType:@"png"];

那会儿代码,在One plus 7 / 一加 7 plus/ 华为平板Pro,都能彰显图片,直接出口图片本人的尺寸都为 原图尺寸的 三分一.

NSLog(@"加载后的图片尺寸:%@",[NSValue valueWithCGSize:self.sampleImageView.image.size]);

可是,此处有三个难题.@3x总是被解读为三倍图,在索尼爱立信上,便是大家须求的尺寸,可是在surface上,尺寸就有点偏小了.我们在平板电脑上,日常总是需求将此张图依据@2x图来展现.那是三个规律!做过索爱和GALAXY Tab通用图标尺寸适配的童鞋,应该早就注意到了.

故而,以往要缓解的关键技术难点是:如何把
@3x图,在三星平板上遵从@2x图来解读?相对完好代码如下,最后输出的图片尺寸在一加上为原始尺寸的33.33%,在surface上为原始尺寸的六分之三,就是大家要求的:

 NSString * bundlePath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"main.bundle"];
 NSBundle * mainBundle = [NSBundle bundleWithPath:bundlePath];
 NSString * imgPath = [mainBundle pathForResource:@"sample@3x" ofType:@"png"];

 UIImage * image;
 static NSString * model;

 if (!model) {
     model = [[UIDevice currentDevice]model];
 }

 if ([model isEqualToString:@"iPad"]) {
     NSData *imageData = [NSData dataWithContentsOfFile: imgPath];
     image = [UIImage imageWithData:imageData scale:2.0];
 }else{
     image = [UIImage imageWithContentsOfFile: imgPath];
 }

 self.sampleImageView.image = image;

 NSLog(@"加载后的图片尺寸:%@",[NSValue valueWithCGSize:self.sampleImageView.image.size]);

招聘职位:大数额平台专家

包装为类目(category),实现自定义的 imageNamed

此处完成了一个不难够用的类目方法,帮衬从钦点bundle读取钦点名字的图样:

#import "UIImage+imageNamed_bundle_.h"

@implementation UIImage (imageNamed_bundle_)
+ (UIImage *)imageNamed:(NSString *)imgName bundle:(NSString *)bundleName
{
    bundleName = [NSString stringWithFormat:@"%@.bundle",bundleName];
    imgName = [NSString stringWithFormat:@"%@@3x",imgName];

    NSString * bundlePath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent: bundleName];
    NSBundle * mainBundle = [NSBundle bundleWithPath:bundlePath];
    NSString * imgPath = [mainBundle pathForResource:imgName ofType:@"png"];

    UIImage * image;
    static NSString * model;

    if (!model) {
        model = [[UIDevice currentDevice]model];
    }

    if ([model isEqualToString:@"iPad"]) {
        NSData *imageData = [NSData dataWithContentsOfFile: imgPath];
        image = [UIImage imageWithData:imageData scale:2.0];
    }else{
        image = [UIImage imageWithContentsOfFile: imgPath];
    }
    return  image;
}
@end

借助类目,原来的调用,可以简化为:

UIImage * image = [UIImage imageNamed:@"sample" bundle:@"main"];
self.sampleImageView.image = image;

也援救有层级结构的图片财富的读取呦:

UIImage * image = [UIImage imageNamed:@"sub/sample" bundle:@"main"];
self.sampleImageView.image = image;

职位描述

  • 肩负简书大数额平台技术架构划设想计,设计与支出,消除海量数据计算面临的挑衅;
  • 治本、优化并珍视Hadoop、斯Parker等集群,保证集群规模不断、稳定;
  • 担当HDFS/hive/HBase的功力、品质和增加,化解并实现工作必要;
  • 扶植创建数据模型,对数据开始展览开挖、优化及计算。

参考链接

岗位要求

  1. 本科及以上学历,3-5 年Hadoop/Hive/Hbase/斯Parker/Flume/卡夫卡生产条件工作经验;
  2. 享有主流大数量工具/平台实际项目经验,如 Hadoop /HBase /Hive /Spark/Storm 等等,并熟识所选用工具的技巧原理、首要特色;
  3. 深谙主流大数据工具/平台实际布署架构和骨干运转,具备架构划设想计能力,至少承担达成一个海量数据有关制品或项指标技能架构划设想计、完毕者优先;
  4. JAVA基础扎实,掌握IO、二十十二线程、集合、并签发承包合约,对JVM原理有自然的驾驭;
  5. 深谙常用机器学习算法,如逻辑回归/贝叶斯网络/决策树/随机森林/GBDT/协助向量机/深度神经网络等,对于特征工程、算法采用和调优、测试评估有实战经验者优先;
  6. 有过网络数据挖掘分析应用的经验者优先,如用户画像/用户作为分析/推荐系统/内容爬取与寻找/心绪分析/语义提取等等;
  7. 甘当海量数据解析、挖掘,肯钻研,对数码敏感,简书用户大加分。

比比皆是专属 github 项目主页

https://github.com/ios122/ios_assets_hot_update

报酬范围

  • 30K-40K

干活地点

  • 北京市徐汇区

行事环境

简历投递

若果你有趣味参与大家,请将简历发送至
hr@jianshu.com
,邮件标题格式为:“姓名 – 大数目平台专家 –
X年工作经验
”。借使你在简书拥有账号,请在邮件中申明。收到简历后,大家会透过邮件通告后续布署。

越多岗位

管理,二零一七年简书招募安排现已拉开,请关心:
简书招聘专题

简书与您,不见不散:)

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注