zoukankan      html  css  js  c++  java
  • iOS中资源文件的”另类“处理方式

    早上研究了一下SMCalloutView,发现作者在代码中直接将图片作成了字符串放在了源代码文件中。 这样做的好处是程序依赖的资源文件同code直接放置在了一起,使用的时候只要把源代码拷贝进去就可以了。 要折腾倒也挺简单的:先将图片资源转成Base64字符串,再将字符串声明成常量。使用的时候使用NSData转换一下,再转成UIImage就可以使用了:

    + (UIImage *)embeddedImageNamed:(NSString *)name {
        if ([UIScreen mainScreen].scale == 2)
            name = [name stringByAppendingString:@"$2x"];
        
        SEL selector = NSSelectorFromString(name);
        
        if (![(id)self respondsToSelector:selector]) {
            NSLog(@"Could not find an embedded image. Ensure that you've added a category method to UIImage named +%@", name);
            return nil;
        }
        
        // We need to hush the compiler here - but we know what we're doing!
        #pragma clang diagnostic push
        #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        NSString *base64String = [(id)self performSelector:selector];
        #pragma clang diagnostic pop
        
        UIImage *rawImage = [UIImage imageWithData:[self dataWithBase64EncodedString:base64String]];
        return [UIImage imageWithCGImage:rawImage.CGImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
    }

    另外,我怀疑作者之所以这么折腾,也有另外一个说不出口的原因吧。SMCalloutView的图片资源,其实利用UIKit-Artwork-Extractor从iOS中提取的UICalloutView的资源,后者是private API,属于未开放范畴。使用base64这样转一手,可以方便上架检测?毕竟,使用此种方式来处理图片资源,就意味着无法使用系统的图片缓存了。

  • 相关阅读:
    前人风采
    【C++ Primer 第16章】1. 定义模板 (一)
    CCF CSP认证考试试题
    【C++ Primer 第11章】4. 无序容器
    【C++ Primer 第11章 练习答案】2. 关联容器操作
    【C++ Primer 第11章】2. 关联容器操作
    dxRatingControl使用
    dxRangeTrackBar使用教程
    UniConnectDialog使用
    Delphi窗体置顶及失去焦点后取得焦点
  • 原文地址:https://www.cnblogs.com/wupher/p/2659840.html
Copyright © 2011-2022 走看看