iOS開發之靜態庫(三)—— 圖片、界面xib等資源文件封裝到.a靜態庫


 

編譯環境: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工程起一個其他名字,使用時修改一下。

刪除不需要的文件

加入我們的文件

 

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@property (strong, nonatomic) UIImageView *imageView;

@end
//
//  ViewController1.m
//  MyToolsWithAssetsADemo
//
//  Created by LZH on 14-8-15.
//  Copyright (c) 2014年 LZH. All rights reserved.
//

#import "ViewController1.h"
#import "BundleTools.h"

#import <QuartzCore/QuartzCore.h>

@interface ViewController1 ()

@end

@implementation ViewController1
@synthesize imageView = _imageView;

- (id)init{
    
    NSBundle *myBundle = [BundleTools getBundle];
    
    //self = [super initWithNibName: @"ViewController1" bundle: nil];
    //從bundle中獲取界面文件
    self = [super initWithNibName: [NSString stringWithUTF8String: object_getClassName(self)] bundle: myBundle];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    _imageView = [[UIImageView alloc] initWithFrame: CGRectMake(50, 100, 220, 220)];
    
    //_imageView.image = [UIImage imageNamed: @"0001.jpg"];
    //從bundle中獲取圖片資源
    _imageView.image = [UIImage imageWithContentsOfFile: [BundleTools getBundlePath: @"0001.jpg"]];
    
    //給圖片增加圓角
    _imageView.layer.cornerRadius = 20;
    _imageView.layer.masksToBounds = YES;
    _imageView.layer.borderWidth = 3;
    _imageView.layer.borderColor = [UIColor orangeColor].CGColor;
    
    [self.view addSubview: _imageView];
    
}
- (IBAction)backButton:(id)sender {
    [self dismissViewControllerAnimated: YES completion: NULL];
}

@end
//
//  BundleTools.h
//  MyToolsWithAssetsA
//
//  Created by LZH on 14-8-15.
//  Copyright (c) 2014年 LZH. All rights reserved.
//

#import <Foundation/Foundation.h>

#define BUNDLE_NAME @"MyToolsWithAssetsA"

@interface BundleTools : NSObject

+ (NSString *)getBundlePath: (NSString *) assetName;
+ (NSBundle *)getBundle;

@end
//
//  BundleTools.m
//  MyToolsWithAssetsA
//
//  Created by LZH on 14-8-15.
//  Copyright (c) 2014年 LZH. All rights reserved.
//

#import "BundleTools.h"

@implementation BundleTools

+ (NSBundle *)getBundle{
    
    return [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: BUNDLE_NAME ofType: @"bundle"]];
}

+ (NSString *)getBundlePath: (NSString *) assetName{
    
    NSBundle *myBundle = [BundleTools getBundle];
    
    if (myBundle && assetName) {
        
        return [[myBundle resourcePath] stringByAppendingPathComponent: assetName];
    }
    
    return nil;
}


@end

  

本項目中使用了兩張圖片,一張是直接在xib文件中指定,另一張手動添加,並從bundle中獲取圖片資源

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

 

合並

 

三、創建測試工程

創建iOS下的單視圖模板

工程命名

導入靜態庫、頭文件和bundle資源包

在主界面Main.storyboard上增加一個Button,其響應函數代碼如下:

//按鈕響應函數
- (IBAction)buttonPressed:(id)sender {
    
    ViewController1 *view1 = [[ViewController1 alloc] init];
    view1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;   //界面切換動畫效果
    [self presentViewController: view1 animated: YES completion: NULL];

}

  

說明:

       我們練習對圖片,xib等資源的封裝,而測試工程卻使用的是storyboard,看起來有點混亂,主要是從XCode5.0開始,所創建的項目界面都被默認的設置成了storyboard,此處也不想去折騰了,意思表達清楚就OK了,偶爾來點混搭也是不錯滴。

"Command + R"編譯運行,運行結果

 

 

大功告成!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM