在靜態庫的製做中,不少時候咱們的靜態庫也是帶着文件,圖片和多媒體資源的。android
若只是直接加入到項目中也是能夠,可是,考慮到方便管理(方便插件使用者的管理),咱們但願把插件的資源文件打成一個包來管理。api
固然有人也會說,那我直接在項目中新建一個group來管理也是同樣的容易。框架
此刻,我只能很裝逼的說一句:這樣,顯得專業點麼~。url
你看three20啊,銀聯啊等等。總體項目目錄相對看起來簡約點。spa
bundle的製做。插件
1.新建一個文件夾,而後將文件夾命名修改你要的文件夾名,而且加上後綴:xxx.bundle。code
而後你就會看到文件夾變成了一個咱們常見的bundle樣式的文件夾。對象
2.加入文件資源,此時爲了方便管理,咱們最好如今裏面新建3種資源的文件夾blog
固然了,不建立也不要緊,可是這個images文件夾最好建立,由於,咱們會把全部的圖片資源放在這裏來方便管理。three
而後添加點圖片到images中。
3.把bundle文件加入到項目中
4.讀取和使用文件。
UILabel *la = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 50, 50)]; la.text = @"老王"; NSString *image_url = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"nono.bundle/images/android.png"]; la.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:image_url]];
此時,由於之前咱們獲取UIImage對象大部分都是直接使用的api爲:
[UIImage imageNamed:@"android.png"]
方法其實也是經過相對路徑給咱們找到了圖片資源。
可是在咱們本身製做的bundle文件夾的圖片資源則不能使用該方法來找到了。
咱們每次指定圖片須要傳入一個很長的地址,以爲比較麻煩。可是咱們會發現,圖片都是在xxx.bundle/images下面。
那麼咱們也可使用宏或是類別來定義一個方法來簡單到和[UIImage imageNamed:@"android.png"]同樣。只需一個文件名就好了。
宏的表現能夠參考three20下的
TTIMAGE(@"bundle://Three20.bundle/images/backIcon.png")
返回的就是一個image對象。
three20框架中實際上是使用了scheme的思想,bundle://和document;//來加載不一樣文件夾下的資源。
加載自定義bundle文件夾下的圖片最後就是根據
先獲取應用的絕對路徑
mainbundle_path = [NSBundlemainBundle] resourcePath] ;
而後截取了bundle://後面的path 和mainbundle_path組裝成最後的地址。
對於咱們,簡單的實現能夠直接使用類別
1 -(UIImage*) imagesNamedFromCustomBundle:(NSString *)name { 2 NSString *main_images_dir_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"nono.bundle/images"]; 3 // NSAssert(main_images_dir_path, @"main_images_dir_path is null"); 4 NSString *image_path = [main_images_dir_path stringByAppendingPathComponent:name]; 5 return [UIImage imageWithContentsOfFile:image_path]; 6 }
建立一個UIImage的類別,添加這個擴展的方法。