iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库

转自:https://blog.****.net/mylizh/article/details/38707175

编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)


一、首先将资源文件打包成bundle


新建工程:File -> New -> Project... -> OS X -> Framework & Library -> Bundle

我们必须借助于OS X,因为iOS框架中没有创建Bundle的模板


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


填写项目名称


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


保存位置


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


    其实本无需这么麻烦,bundle的本质是一个目录,我们完全可以创建一个文件夹,把需要封装的资源文件拷贝至该目录下,将其改成后缀名为bundle即可,然后就可以使用NSBundle提供的接口访问其内部的资源文件,当然,也可以通过访问普通文件目录的方法访问其内部的资源。

    此处主要是考虑到有xib文件的存在,由前面的知识可知,xib是文本文件,编译后要被序列化为二进制的nib文件,使用时将nib文件反序列化,就可以正常显示界面了。而bundle本身是静态的,其内部的资源包不参与项目的编译,所以,此处必须创建工程把xib序列化为二进制的nib,否则的话,直接创建文件夹后改名就可以了。

    因此一些辅助文件(红色矩形框起的部分)都不需要了,直接删除即可


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


有一点一定要十分十分的小心:

删除上面红色矩形框中文件时,可以完全的删除,因为这些文件都是我们自己创建的


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库

iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


而删除下面矩形框中的文件时,千万不能“Move to Trash”,只能"Remove References"(删除引用),因为framework是系统框架的一部分,如果删除了,下次运行时候,就会报错。我就犯过这个低级错误,从来没想过系统文件会被自己删除,所以也没往这方面去想,以至于花费了很长时间才解决了问题。


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


由于我们删除了plist文件,所以必须在Build Settings中删除对它的引用


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


同样,也要删除pch文件的引用


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


我们创建项目时选的是OS X中的框架,所以此处需要修改Base SDK为iOS


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


修改后


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


设置完毕,现在拷贝资源文件到项目中来


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


正是我们需要的两个图片文件,一个xib文件


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


一切就绪,按快捷键"Command + B"编译,编译成功后,Products下面的MyToolsWithAssetsA.bundle由红色变成了黑色,表示编译成功


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


找到生成的bundle所在的目录


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


查看里面的内容


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


打开


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


正是我们所需要的,xib也被转化成了nib


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


二、编译静态库


创建静态库


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


通常,bundle的名称要和对应的静态库或framework相同(也可以不相同),所以此处静态库也命名为“MyToolsWithAssetsA”,这就需要和前面的bundle工程存放在不同的目录,当然,如果不想这么麻烦,也可以开始给bundle工程起一个其他名字,使用时修改一下。


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


删除不需要的文件


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


加入我们的文件


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


[objc] view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController1 : UIViewController  
  4.   
  5. @property (strongnonatomicUIImageView *imageView;  
  6.   
  7. @end  

[objc] view plain copy
  1. //  
  2. //  ViewController1.m  
  3. //  MyToolsWithAssetsADemo  
  4. //  
  5. //  Created by LZH on 14-8-15.  
  6. //  Copyright (c) 2014年 LZH. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController1.h"  
  10. #import "BundleTools.h"  
  11.   
  12. #import <QuartzCore/QuartzCore.h>  
  13.   
  14. @interface ViewController1 ()  
  15.   
  16. @end  
  17.   
  18. @implementation ViewController1  
  19. @synthesize imageView = _imageView;  
  20.   
  21. - (id)init{  
  22.       
  23.     NSBundle *myBundle = [BundleTools getBundle];  
  24.       
  25.     //self = [super initWithNibName: @"ViewController1" bundle: nil];  
  26.     //从bundle中获取界面文件  
  27.     self = [super initWithNibName: [NSString stringWithUTF8String: object_getClassName(self)] bundle: myBundle];  
  28.     if (self) {  
  29.         // Custom initialization  
  30.     }  
  31.     return self;  
  32. }  
  33.   
  34. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  35. {  
  36.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  37.     if (self) {  
  38.         // Custom initialization  
  39.     }  
  40.     return self;  
  41. }  
  42.   
  43. - (void)viewDidLoad  
  44. {  
  45.     [super viewDidLoad];  
  46.     // Do any additional setup after loading the view from its nib.  
  47.       
  48.     _imageView = [[UIImageView alloc] initWithFrame: CGRectMake(50100220220)];  
  49.       
  50.     //_imageView.image = [UIImage imageNamed: @"0001.jpg"];  
  51.     //从bundle中获取图片资源  
  52.     _imageView.image = [UIImage imageWithContentsOfFile: [BundleTools getBundlePath@"0001.jpg"]];  
  53.       
  54.     //给图片增加圆角  
  55.     _imageView.layer.cornerRadius = 20;  
  56.     _imageView.layer.masksToBounds = YES;  
  57.     _imageView.layer.borderWidth = 3;  
  58.     _imageView.layer.borderColor = [UIColor orangeColor].CGColor;  
  59.       
  60.     [self.view addSubview: _imageView];  
  61.       
  62. }  
  63. - (IBAction)backButton:(id)sender {  
  64.     [self dismissViewControllerAnimatedYES completion: NULL];  
  65. }  
  66.   
  67. @end  

[objc] view plain copy
  1. //  
  2. //  BundleTools.h  
  3. //  MyToolsWithAssetsA  
  4. //  
  5. //  Created by LZH on 14-8-15.  
  6. //  Copyright (c) 2014年 LZH. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #define BUNDLE_NAME @"MyToolsWithAssetsA"  
  12.   
  13. @interface BundleTools : NSObject  
  14.   
  15. + (NSString *)getBundlePath: (NSString *) assetName;  
  16. + (NSBundle *)getBundle;  
  17.   
  18. @end  

[objc] view plain copy
  1. //  
  2. //  BundleTools.m  
  3. //  MyToolsWithAssetsA  
  4. //  
  5. //  Created by LZH on 14-8-15.  
  6. //  Copyright (c) 2014年 LZH. All rights reserved.  
  7. //  
  8.   
  9. #import "BundleTools.h"  
  10.   
  11. @implementation BundleTools  
  12.   
  13. + (NSBundle *)getBundle{  
  14.       
  15.     return [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: BUNDLE_NAME ofType@"bundle"]];  
  16. }  
  17.   
  18. + (NSString *)getBundlePath: (NSString *) assetName{  
  19.       
  20.     NSBundle *myBundle = [BundleTools getBundle];  
  21.       
  22.     if (myBundle && assetName) {  
  23.           
  24.         return [[myBundle resourcePath] stringByAppendingPathComponent: assetName];  
  25.     }  
  26.       
  27.     return nil;  
  28. }  
  29.   
  30.   
  31. @end  

本项目中使用了两张图片,一张是直接在xib文件中指定,另一张手动添加,并从bundle中获取图片资源

"Command + B"编译,分别生成针对模拟器的静态库和针对真机的静态库


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


合并


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


三、创建测试工程


创建iOS下的单视图模板


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


工程命名


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


导入静态库、头文件和bundle资源包


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


在主界面Main.storyboard上增加一个Button,其响应函数代码如下:

[objc] view plain copy
  1. //按钮响应函数  
  2. - (IBAction)buttonPressed:(id)sender {  
  3.       
  4.     ViewController1 *view1 = [[ViewController1 alloc] init];  
  5.     view1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;   //界面切换动画效果  
  6.     [self presentViewController: view1 animatedYES completion: NULL];  
  7.   
  8. }  

说明:

    我们练习对图片,xib等资源的封装,而测试工程却使用的是storyboard,看起来有点混乱,主要是从XCode5.0开始,所创建的项目界面都被默认的设置成了storyboard,此处也不想去折腾了,意思表达清楚就OK了,偶尔来点混搭也是不错滴。


"Command + R"编译运行,运行结果


iOS开发之静态库(三)—— 图片、界面xib等资源文件封装到.a静态库


大功告成!