自定义的动态

那篇文章,要消除的是,使用三个自定义的 imageNamed 函数来替代系统的 imageNamed 函数.内部逻辑,将贯通相比较论证 关于"合适"的图纸的定义.对iOS加载图片的法规不是很熟习的童鞋,能够重视看那篇.

自定义的动态。不等后缀图片加载的早期级

  • 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的世代不会被加载.仅以红米7 plus 和 苹果平板Pro为例剖判,其余景况可自行.所用验证版本为iOS10,未来不可同日而语机型手提式有线话机和系统大概会有差距.

想和谐入手试一下的,能够下载示例: 十分小,唯有100多K.编写翻译,作者那时用的是 Xcode 8.

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

图片 1

能源把到一个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];

使华为 @3x 与华为平板 @2x 共用同样张图纸

先是是需求出示加载 @3x 的图纸:

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

此时期码,在Nokia 7 / 摩托罗拉 7 plus/ GALAXY TabPro,都能显得图片,直接出口图片本人的尺码都为 原图尺寸的 一半.

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

而是,此处有叁个难题.@3x总是被解读为三倍图,在华为上,就是大家须要的尺码,可是在GALAXY Tab上,尺寸就某个偏小了.大家在surface上,平常总是须要将此张图遵照@2x图来呈现.那是一个规律!做过索爱和平板电脑通用Logo尺寸适配的童鞋,应该已经注意到了.

就此,未来要缓慢解决的关键本领难点是:如何把 @3x图,在三星平板上遵照@2x图来解读?相对完整代码如下,最后输出的图片尺寸在HTC上为原始尺寸的52%,在三星平板上为原始尺寸的一半,就是大家必要的:

 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;

参照他事他说加以考察链接

多元专门项目 github 项目主页

本文由明仕msyz手机版发布于旅游-环球旅讯,转载请注明出处:自定义的动态

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。