看這篇文章前掐松,我強烈推薦先看這篇博客
iOS中自己做靜態(tài)庫
以及這篇注意事項:
靜態(tài)庫中要注意的坑
我這是基于Xcode8寫的踱侣,但是版本以下的也是一樣的制作,只是Xcode8的某些界面有點小改變而已甩栈。
廢話不多說泻仙,開始寫吧。
首先打開Xcode新建一個Bundle工程量没,如下圖
工程命名為SourcePic(這個名字大家隨意自己喜歡)一進來的工程是這樣的:
大家會發(fā)現(xiàn)玉转,這個不是個可執(zhí)行的文件,因為它只是一個資源包殴蹄,并不參與編譯究抓。
所謂資源文件包,那么最重要的就是里面的那個bundle了袭灯,我這里以制作一張圖片為資源包為例刺下,所以在工程里加入一張圖片,圖片命名為one稽荧,格式為png橘茉。在這里,特別提醒一句的就是,因為圖片有2x畅卓,3x的格式擅腰,會自動生成tiff格式的圖片,所以如果不需要生成tiff的格式翁潘,Targets -> Build Settings里搜索hidp趁冈,將屬性設成No即可。
然后:
點擊小箭頭拜马,進入
然后將這個復制渗勘,粘貼到桌面里自己新建的一個文件夾中。至此俩莽,資源包已經(jīng)做好待使用旺坠。
再新建另一個工程,制作靜態(tài)庫扮超,在這里想要吐槽的就是价淌,蘋果不允許用戶使用動態(tài)庫上架,但自己卻堂而皇之的使用動態(tài)庫(呀瞒津,扯遠了!@ㄊO矧健)
操作如下:
進來之后會有一個與工程名相同的類,
剛進來時濒翻,那個.a的文件是紅色的屁柏,大家可以用模擬器或者真機都編譯一次,因為靜態(tài)庫是區(qū)分模擬器使用或者真機使用的有送。編譯之后淌喻,.a文件就會變成上面圖片的正常顏色。然后要在Target中設置此靜態(tài)庫編譯的最低版本雀摘,
就如我這里設置系統(tǒng)版本最低是8.0以上才能使用這個靜態(tài)庫裸删,其他版本編譯是不能通過的,然后就是配置:
點擊Edit Scheme阵赠,
然后再編譯成功涯塔。
現(xiàn)在就是自己想要開放對外的接口,在.h文件里寫上接口清蚀,我這里做一個簡單的示例匕荸,就是調取這個接口,返回一張圖片枷邪,.h文件如下:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StaticLibrary : NSObject
+(UIImage *)start;
@end
.m文件如下:
#import "StaticLibrary.h"
@implementation StaticLibrary
+(UIImage *)start{
NSLog(@"StaticLibrary Start");
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SourcePic" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *path = [bundle pathForResource:@"one" ofType:@"png"];
NSLog(@"bundle path = %@,image path = %@",bundlePath,path);
UIImage *image = [UIImage imageWithContentsOfFile:path];
return image;
}
@end
大家可以發(fā)現(xiàn)榛搔,我這張圖片就是從前面制作的bundle資源包里取。再次用模擬器和真機編譯通過,尋找.a文件的位置:
將.a文件和.h文件拷貝到前面bundle放置的那個文件夾里践惑,現(xiàn)在文件夾里就已經(jīng)有了三個文件:
最后新建一個正常的Xcode工程腹泌,將上面包含三個文件的文件夾添加到項目中,在ViewController中引入三個文件里的.h文件童本,
#import "ViewController.h"
#import "StaticLibrary.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
imageView.center = self.view.center;
imageView.image = [StaticLibrary start];
[self.view addSubview:imageView];
}
@end
大功告成真屯,效果圖如下:
這里我只是用了一個很簡單的圖片做為一個例子,靜態(tài)庫的制作根據(jù)自己的項目需求穷娱,暴露出合適的接口绑蔫,在項目中使用靜態(tài)庫是不是比復制粘貼代碼高大上了很多?
以下是不要跳的坑:
1.靜態(tài)庫中最好不要用xib泵额;
因為xib是文本文件配深,編譯后要被序列化為二進制的nib文件,使用時將nib文件反序列化嫁盲,就可以正常顯示界面了篓叶。而bundle本身是靜態(tài)的,其內部的資源包不參與項目的編譯羞秤,所以缸托,此處必須創(chuàng)建工程把xib序列化為二進制的nib,要用的話就將xib放大bundle文件中編譯瘾蛋,然后xib就會變成.nib的文件俐镐。
2.bundle文件必須放到靜態(tài)庫外面來引用;
如果放在靜態(tài)庫里面哺哼,是讀不到里面的資源的佩抹。
3.如果要暴露其他的.h文件接口,記得在xcode中設置取董。
4.如果靜態(tài)包中有分類棍苹,要在xcode項目中設置,如下圖茵汰;