由于iPhone控件的极度匮乏和自定义组件在重用上的限制,在过去的项目中我们积累了大量的“纯代码”组件——因为IB本身的限制,我们无法把这些组件封装为IB组件库(本来我们想通过分发xib文件的方式重用这些组件,但最终发现这根本不可能,苹果的Plug-in编程不支持iPhone)。
最终我们想到了静态库。虽然这仍然还是一种比较原始的复用方式,但起码我们可以隐藏组件的源代码。
下面, 我们使用iPhone静态库把自定义组件CheckButton 进行进一步的封装。(组件的实现参考前一篇博文《自定义控件复选框和单选框的实现》)
一、实现静态库
新建工程,选择Library下的“Cocoa Touch Static Library”。给工程命名,例如:yhyLibrary。
复制CheckButton组件的4个源文件:CheckButton.h、CheckButton.m、RadioGroup.h、RadioGroup.m到Classes目录下,同时把CheckButton的4个资源文件:check.png、uncheck.png、radio.png、unradio.png,复制到工程文件夹。
按下⌘+b编译,在Products目录下即产生一个 .a文件。
二、新建资源束
静态库中并不能包含资源文件,虽然我们已经把4个资源文件(.png文件)拷贝到静态库工程中,但实际上这些.png是不会添加到target的,也就是说编译结果中并不包含这些资源,因此如果此时调用静态库,所有的资源(字符串、图片)都是缺失的。
我们可以把资源建立成单独的束(Bundle)。
新建工程“Mac OS X-> Framework & Library -> Bundle”,命名为:yhyLibraryBundle。
然后把上面4个.png文件拷进Resouces中去。编译,生成yhyLibraryBundle.bundle文件。
返回静态库工程,新建一个类:Utils 。
编辑Utils.h:
#define MYBUNDLE_NAME @"yhyLibraryBundle.bundle"
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
NSString* getMyBundlePath(NSString* filename);
编辑Utils.m:
#import"Utils.h"
NSString* getMyBundlePath(NSString* filename)
{
NSBundle* libBundle =MYBUNDLE;
if( libBundle && filename ){
NSString* s=[[libBundleresourcePath]stringByAppendingPathComponent:
filename];
NSLog(@"%@",s);
returns;
}
returnnil;
}
函数getMyBundlePath可以取得束yhyLibraryBundle中具体资源的绝对文件路径,如:
/Users/kmyhy/Library/Application Support/iPhone Simulator/4.2/Applications/8213652F-A47E-456A-A7BB-4CD40892B66D/yhyLibTest.app/yhyLibraryBundle.bundle/Contents/Resources/radio.png
同时,修改CheckButton.m中的代码,导入Utils.h头文件,把其中获取图片的代码由imageNamed修改为imageWithContentsOfFile,如:
[iconsetImage:[UIImageimageWithContentsOfFile:getMyBundlePath(checkname)]];
即通过绝对路径读取图片资源。
除了这种方法,我们还可以有一个简单办法,就是把4个资源文件直接拷贝到你调用静态库的应用工程中(不需要修改静态库代码)。
三、静态库调用
1、添加静态库
新建Window-based Application工程,给工程命名,如yhyLibraryTest。
右键点Frameworks->Add->Existing Files..,把静态库工程的yhyLibrary.xcodeproj文件添加到当前工程(不要选择Copy items)。
选中添加进来的yhyLibrary.xcodeproj文件,勾选“include to target”选项,如下图,打上最后一个小勾:
2、添加Direct Dependencies(即引用工程)
类似于Visual Studio中的引用工程,目的是便于在本工程中直接编辑所引用的静态库工程,以便对静态库进行修改。
在“Targets”目录下选择“FirstLibraryTest”,点击“info”按钮,调出目标的属性窗口,切换到“General”栏,点击“Direct Dependencies”下方的“+”按钮,将工程静态库libyhyLibrary添加到Direct Dependencies中,结果如下图:
3、添加头文件搜索路径
打开工程的info窗口,在Build栏中找到Header Search Paths,添加字符串“../yhyLibrary”。
4、 引用资源束
在target的Copy Bundle Resources上右键,选择“Add->Existing File…”,把前面生成的yhyLibraryBundle.bundle束添加到工程。
5、调用静态库中的类
编辑application:(UIApplication*)application didFinishLaunchingWithOptions:方法中的代码:
//单选按钮组
RadioGroup*rg=[[RadioGroupalloc]init];
//第1个单选按钮
CheckButton* cb=[[CheckButtonalloc]initWithFrame:CGRectMake(20,60,260,32)];
//把单选按钮加入按钮组
[rgadd:cb];
cb.label.text=@"★";
cb.value=[[NSNumberalloc]initWithInt:1];
//把按钮设置为单选按钮样式
cb.style=CheckButtonStyleRadio;
//加入视图
[self.windowaddSubview:cb];
[cbrelease];//add后,会自动持有,可以释放
//第2个单选按钮
cb=[[CheckButtonalloc]initWithFrame:CGRectMake(20,100,260,32)];
[rgadd:cb];
cb.label.text=@"★★";
cb.value=[[NSNumberalloc]initWithInt:2];
cb.style=CheckButtonStyleRadio;
[self.windowaddSubview:cb];
[cbrelease];
//第3个单选按钮
cb=[[CheckButtonalloc]initWithFrame:CGRectMake(20,140,260,32)];
[rgadd:cb];
cb.label.text=@"★★★";
cb.value=[[NSNumberalloc]initWithInt:3];
cb.style=CheckButtonStyleRadio;
[self.windowaddSubview:cb];
[cbrelease];
运行结果如下:
6、分发静态库
将生成的.a文件和.bundle文件打包分发给其他人。
相关推荐
Altium库 AD封装库原理图库元器件接插件芯片PCB封装库(AD大全),可供学习及设计参考可直接用于你的项目设计中。 AD个人封装库:发光显示器件.PCBLIB.rar AD个人封装库:基本元件.PcbLib.rar AD个人封装库:常用元件...
wpf 自定义 封装的控件
想生成一个静态库A,其依赖于静态库B,要求静态库A直接封装静态库B,以ar脚本语言实现
官方AD封装库:Lattice.rar
纯SDK封装IE控件源码,非MFC,ATL封装.
JavaScript 封装库:BETA 4.0 版
三极管MOS管TO类封装PCB封装库(AD库,封装带3D视图),Altium Designer的PCB封装库,.PcbLib格式的,带3D视图,非常实用。详细封装型号如下:Component Count : 24 Component Name ------------------------------...
通过调用第三方库(lib、dll、.h)文件,封装为ocx控件,该工程主要实现了视频监控中得多屏显示
WPF 自定义控件库 常用控件封装&常用控件样式重写
常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库(AD库,封装带3D视图) 常用贴片电感PCB封装库...
用C#封装了3个Dropdownlist,只公开3个ID(三个表的主键),可以通过这三个ID获取相信DropDownList的值,也可以通过这三个ID设置其值。 仅供学习。 三个表的数据库脚本在*.sql中。
AD用PCB封装库,包括(DIP插件系列3D封装库)作者主页下有全套的三维PCB封装库。欢迎下载。 0000000
基于c#自定义封装控件(IP地址填写控件)
dll文件封装成OCX控件,当然其中也有对dll的调用,其实是c++制作OCX的文档
SSOP系列封装Altium封装库AD三维视图PCB封装库(2D3D封装库),封装列表如下:Component Count : 21 Component Name ----------------------------------------------- SSOP8_L SSOP8_M SSOP8_N SSOP14_L SSOP14_M ...
qt常用控件-自定义。
protel 、protel dxp、altium designer 元件库 封装库大集合 综合csdn全网资源
自己写的一个js分页控件.已经封装,可以直接使用. 适合各种用途的分页控制. 如果界面不够美观,只需要修改css即可.
RxToast : Toast的封装 RxTitle : 自定义标题控件 RxTextAutoZoom : 文字根据布局大小自动缩放效果 RxRunTextView : TextView实现跑马灯效果 RxTextviewVertical : 单行文字上下滚动 RxTextViewVerticalMore :...
IP4-40封装Altium封装库AD三维视图PCB封装库(2D3D封装库)25个,封装列表如下: Component Count : 25 Component Name ----------------------------------------------- DIP_TP20-300 DIP_TP40-600 DIP4-300 DIP...