1. 程式人生 > >iOS開發之靜態庫(三)—— 圖片、介面xib等資原始檔封裝到.a靜態庫

iOS開發之靜態庫(三)—— 圖片、介面xib等資原始檔封裝到.a靜態庫

轉自:https://blog.csdn.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的模板


填寫專案名稱


儲存位置


    其實本無需這麼麻煩,bundle的本質是一個目錄,我們完全可以建立一個資料夾,把需要封裝的資原始檔拷貝至該目錄下,將其改成字尾名為bundle即可,然後就可以使用NSBundle提供的介面訪問其內部的資原始檔,當然,也可以通過訪問普通檔案目錄的方法訪問其內部的資源。

    此處主要是考慮到有xib檔案的存在,由前面的知識可知,xib是文字檔案,編譯後要被序列化為二進位制的nib檔案,使用時將nib檔案反序列化,就可以正常顯示介面了。而bundle本身是靜態的,其內部的資源包不參與專案的編譯,所以,此處必須建立工程把xib序列化為二進位制的nib,否則的話,直接建立資料夾後改名就可以了。

    因此一些輔助檔案(紅色矩形框起的部分)都不需要了,直接刪除即可


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

刪除上面紅色矩形框中檔案時,可以完全的刪除,因為這些檔案都是我們自己建立的



而刪除下面矩形框中的檔案時,千萬不能“Move to Trash”,只能"Remove References"(刪除引用),因為framework是系統框架的一部分,如果刪除了,下次執行時候,就會報錯。我就犯過這個低階錯誤,從來沒想過系統檔案會被自己刪除,所以也沒往這方面去想,以至於花費了很長時間才解決了問題。


由於我們刪除了plist檔案,所以必須在Build Settings中刪除對它的引用


同樣,也要刪除pch檔案的引用


我們建立專案時選的是OS X中的框架,所以此處需要修改Base SDK為iOS


修改後


設定完畢,現在拷貝資原始檔到專案中來


正是我們需要的兩個圖片檔案,一個xib檔案


一切就緒,按快捷鍵"Command + B"編譯,編譯成功後,Products下面的MyToolsWithAssetsA.bundle由紅色變成了黑色,表示編譯成功


找到生成的bundle所在的目錄


檢視裡面的內容


開啟


正是我們所需要的,xib也被轉化成了nib


二、編譯靜態庫

建立靜態庫


通常,bundle的名稱要和對應的靜態庫或framework相同(也可以不相同),所以此處靜態庫也命名為“MyToolsWithAssetsA”,這就需要和前面的bundle工程存放在不同的目錄,當然,如果不想這麼麻煩,也可以開始給bundle工程起一個其他名字,使用時修改一下。


刪除不需要的檔案


加入我們的檔案


  1. #import <UIKit/UIKit.h>
  2. @interface ViewController1 : UIViewController  
  3. @property (strongnonatomicUIImageView *imageView;  
  4. @end

  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. #import "ViewController1.h"
  9. #import "BundleTools.h"
  10. #import <QuartzCore/QuartzCore.h>
  11. @interface ViewController1 ()  
  12. @end
  13. @implementation ViewController1
  14. @synthesize imageView = _imageView;  
  15. - (id)init{  
  16.     NSBundle *myBundle = [BundleTools getBundle];  
  17.     //self = [super initWithNibName: @"ViewController1" bundle: nil];
  18.     //從bundle中獲取介面檔案
  19.     self = [super initWithNibName: [NSString stringWithUTF8String: object_getClassName(self)] bundle: myBundle];  
  20.     if (self) {  
  21.         // Custom initialization
  22.     }  
  23.     returnself;  
  24. }  
  25. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  26. {  
  27.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  28.     if (self) {  
  29.         // Custom initialization
  30.     }  
  31.     returnself;  
  32. }  
  33. - (void)viewDidLoad  
  34. {  
  35.     [super viewDidLoad];  
  36.     // Do any additional setup after loading the view from its nib.
  37.     _imageView = [[UIImageView alloc] initWithFrame: CGRectMake(50100220220)];  
  38.     //_imageView.image = [UIImage imageNamed: @"0001.jpg"];
  39.     //從bundle中獲取圖片資源
  40.     _imageView.image = [UIImage imageWithContentsOfFile: [BundleTools getBundlePath@"0001.jpg"]];  
  41.     //給圖片增加圓角
  42.     _imageView.layer.cornerRadius = 20;  
  43.     _imageView.layer.masksToBounds = YES;  
  44.     _imageView.layer.borderWidth = 3;  
  45.     _imageView.layer.borderColor = [UIColor orangeColor].CGColor;  
  46.     [self.view addSubview: _imageView];  
  47. }  
  48. - (IBAction)backButton:(id)sender {  
  49.     [self dismissViewControllerAnimatedYES completion: NULL];  
  50. }  
  51. @end

  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. #import <Foundation/Foundation.h>
  9. #define BUNDLE_NAME @"MyToolsWithAssetsA"
  10. @interface BundleTools : NSObject  
  11. + (NSString *)getBundlePath: (NSString *) assetName;  
  12. + (NSBundle *)getBundle;  
  13. @end

  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. #import "BundleTools.h"
  9. @implementation BundleTools  
  10. + (NSBundle *)getBundle{  
  11.     return [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: BUNDLE_NAME ofType@"bundle"]];  
  12. }  
  13. + (NSString *)getBundlePath: (NSString *) assetName{  
  14.     NSBundle *myBundle = [BundleTools getBundle];  
  15.     if (myBundle && assetName) {  
  16.         return [[myBundle resourcePath] stringByAppendingPathComponent: assetName];  
  17.     }  
  18.     return nil;  
  19. }  
  20. @end

本專案中使用了兩張圖片,一張是直接在xib檔案中指定,另一張手動新增,並從bundle中獲取圖片資源

"Command + B"編譯,分別生成針對模擬器的靜態庫和針對真機的靜態庫


合併


三、建立測試工程

建立iOS下的單檢視模板


工程命名


匯入靜態庫、標頭檔案和bundle資源包


在主介面Main.storyboard上增加一個Button,其響應函式程式碼如下:

  1. //按鈕響應函式
  2. 相關推薦

    iOS開發靜態—— 圖片介面xib原始檔封裝到.a靜態

    轉自:https://blog.csdn.net/mylizh/article/details/38707175編譯環境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3)一、首先將資原始檔打包成bundle新建

    圖片介面xib原始檔封裝到.a靜態

    編譯環境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一、首先將資原始檔打包成bundle 新建工程:File -> New -> Project... -> OS X -&g

    基於大數據的電影網站項目開發階段性總結

    字符 crc -c ... chown root per edi 第一個字符 一、基礎講解 1. 主機ping不同虛擬機   虛擬機要設置IP地址,ip段是vmware 編輯菜單-->虛擬網絡編輯器 網段, 網關:192.168.XXX.2

    嵌入式核心及驅動開發學習筆記 點燈實驗

    完成應用程式通過驅動控制硬體的實現。實驗建立在之前的框架上,我們先實現使用者層與核心層之間的資料互動,驅動程式拿到使用者傳來的指令後,就可以執行點燈的動作了。   應用程式與驅動資料互動 對於驅動程式而言,使用copy_to_user 和 copy_from_user

    .linux開發uboot移植——.基礎shell和Makefile回顧

    一.補基礎之shell 1.shell程式執行的執行有多種方法,這裡介紹三種方法: 第一種:./xx.sh,和執行二進位制可執行程式方法一樣。這樣執行shell要求shell程式必須具有可執行許可權。chmod a+x xx.sh來新增可執行許可權。 第二

    Revit二次開發技能篇———窗體的實現

    在Revit中很多時候,都需要使用者輸入相關的資料,然後再進行程式的執行。在Revit中如何實現窗體呢?請看以下程式碼: ParkingForm frmDlg = new ParkingForm(); frmDlg.ShowDia

    iOS開發多線NSThread

    - (IBAction)downloadImageClick:(id)sender { BOOL result = [NSThread isMainThread]; NSLog(@"downloadImageClick%d",result); NSThread *thread = [[

    python web開發 flask教程

    今天的任務是應用web表單,知識點很多。我們將程式碼和具體步驟進行展示。(在這個部分,程式碼部分紅色部分是我們增刪的部分) 。 1.我們採用的是Flask-WTK框架。 Flask-WTF是WTFor

    iOS開發基礎篇14—— Block

    版本 Xcode 9.1 block簡介 block是一個OC物件,於iOS4開始引入。其本身封裝了一段程式碼,可被當作變數、當作引數或作為返回值。block常用於GCD、動畫、排序及各類回撥傳值中。 block程式碼結構圖 注:圖片來自

    iOS開發cocoapods安裝2017

    因為淘寶的映象不在維護了,所以最近看到一篇2107年的cocoapods安裝部落格Mark一下 第一步:安裝rvm, 不管需不需要升級ruby,rvm可以讓你擁有多個版本的Ruby,並且可以在多個版本之間自由切換。如果已經安裝過跳到第2步(rvm -v 檢視是否安

    iOS開發——單例模式singleton解決音樂播放器開發中問題

    開發中很多時候需要一個全域性的東西,保證全域性僅有一份即可,這個時候單例是最佳的選擇。 單例模式:在程式執行過程,一個類只有一個例項,無論如何程式執行過程中只有一份例項。 音樂播放器中就需要這種單例

    爬蟲BeautifulSoup學習

    子節點 rom lac repr 文檔 strong 爬蟲 time contents 遍歷文檔樹:   1、查找子節點   .contents     tag的.content屬性可以將tag的子節點以列表的方式輸出。   print soup.body.cont

    Hive學習Hive元數據信息對應MySQL數據

    需要 pri from metastore node rom lazy 測試 安裝 概述 Hive 的元數據信息通常存儲在關系型數據庫中,常用MySQL數據庫作為元數據庫管理。上一篇hive的安裝也是將元數據信息存放在MySQL數據庫中。 Hive的元數據信息在MySQ

    測試開發系列Python開發mock接口

    有一個 cep 內置 stat 遊標 tab lB 端口號 HERE 於進入主題了,前面的準備工作都已經做好了,下面就開始寫邏輯的代碼了,代碼我已經寫好了,每行都加了註釋,不明白的可以留言。 1 2 3 4 5 6 7 8 9 10 11 12 13

    C++標準STL算法

    out section 區間 and include pla sort 不同 重復元素 算法頭文件: #include<algorithm> #include<numeric> 算法簡介:STL算法采用覆蓋模式而非安插模式,所以調用者必須保證有足夠

    python 實戰模仿開發QQ聊天軟體TCP/IP伺服器與客戶端建設

    無論是p2p還是c/s還是b/s,只要用到通訊,必然是要用到今天寫的這個。 TCP/IP是網路軟體最核心的部分,缺少這個你只能當做單機遊戲玩。 TCP/IP,只需要搞清楚udp和tcp這兩個就可以了。 兩者的區別在於 udp每次傳送資訊都需要傳送ip和埠號,可以比

    ios開發人臉識別給眼睛打上馬賽克

    #import "ViewController.h" @interfaceViewController () @end @implementationViewController - (v

    從零開始學C++IO流類:檔案的讀寫二進位制檔案的讀寫檔案隨機讀寫

    #include <cassert>#include <iostream>#include <fstream>#include <string>using namespace std;struct Test {     int a;     int b; };i

    機器學習整合學習AdaBoost演算法scikit-learn

    一、AdaBoost類庫概述         scikit-learn中AdaBoost類庫比較直接,就是AdaBoostClassifier和AdaBoostRegressor兩個,從名字就可以看出AdaBoostClassifier用於分類,AdaBoostRegr

    軟體開發過程學習筆記概要設計說明書模板

    1 引言 本設計書主要是基於以下目的編寫: 1、對系統概要設計的階段任務成果形成文件,以便階段驗收、評審,最終的文件驗收。 2、對需求階段的文件再次確認過程,對前一階段需求沒有做充分或錯誤的提出修改。 3、明確整個系統的功能框架和資料庫結構,為下一階段的詳細設計、編碼、和