- 浏览: 662884 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lizaochengwen:
网络请求碰到的中文乱码使用encodeURL吧- (NSStr ...
iPhone开发/iPad开发 中文乱码问题 -
hhb19900618:
还是没弄懂怎么解决了中文乱码? 正确代码能重写贴出吗
iPhone开发/iPad开发 中文乱码问题 -
zhengjj_2009:
我的理解是讲ipa文件解压缩之后再重新打包,已经破坏了签名,所 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
zhengjj_2009:
我参考你的“ 从ipa格式的母包生成其它渠道包的shell脚本 ...
xcodebuild和xcrun实现自动打包iOS应用程序 -
同一片天空:
问题果然解决了
iOS 搭建 XMPP实现环境
由于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=[[libBundle resourcePath ] stringByAppendingPathComponent : filename];
NSLog ( @"%@" ,s);
return s;
}
return nil ;
}
函数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,如:
[ icon setImage :[ UIImage imageWithContentsOfFile : 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 =[[ RadioGroup alloc ] init ];
// 第 1 个单选按钮
CheckButton * cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 60 , 260 , 32 )];
// 把单选按钮加入按钮组
[ rg add :cb];
cb. label . text = @"★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 1 ];
// 把按钮设置为单选按钮样式
cb. style = CheckButtonStyleRadio ;
// 加入视图
[ self . window addSubview :cb];
[cb release ]; //add 后,会自动持有,可以释放
// 第 2 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 100 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 2 ];
cb. style = CheckButtonStyleRadio ;
[ self . window addSubview :cb];
[cb release ];
// 第 3 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 140 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 3 ];
cb. style = CheckButtonStyleRadio ;
[ self . window addSubview :cb];
[cb release ];
运行结果如下:
6、分发静态库
将生成的.a文件和.bundle文件打包分发给其他人。
原文:http://blog.sina.com.cn/s/blog_70899b710101crk1.html
最终我们想到了静态库。虽然这仍然还是一种比较原始的复用方式,但起码我们可以隐藏组件的源代码。
下面, 我们使用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=[[libBundle resourcePath ] stringByAppendingPathComponent : filename];
NSLog ( @"%@" ,s);
return s;
}
return nil ;
}
函数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,如:
[ icon setImage :[ UIImage imageWithContentsOfFile : 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 =[[ RadioGroup alloc ] init ];
// 第 1 个单选按钮
CheckButton * cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 60 , 260 , 32 )];
// 把单选按钮加入按钮组
[ rg add :cb];
cb. label . text = @"★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 1 ];
// 把按钮设置为单选按钮样式
cb. style = CheckButtonStyleRadio ;
// 加入视图
[ self . window addSubview :cb];
[cb release ]; //add 后,会自动持有,可以释放
// 第 2 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 100 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 2 ];
cb. style = CheckButtonStyleRadio ;
[ self . window addSubview :cb];
[cb release ];
// 第 3 个单选按钮
cb=[[ CheckButton alloc ] initWithFrame : CGRectMake ( 20 , 140 , 260 , 32 )];
[ rg add :cb];
cb. label . text = @"★★★" ;
cb. value =[[ NSNumber alloc ] initWithInt : 3 ];
cb. style = CheckButtonStyleRadio ;
[ self . window addSubview :cb];
[cb release ];
运行结果如下:
6、分发静态库
将生成的.a文件和.bundle文件打包分发给其他人。
原文:http://blog.sina.com.cn/s/blog_70899b710101crk1.html
发表评论
-
SOCK_STREAM和SOCK_DGRAM
2015-07-23 20:08 1658sock_stream 是有保障的(即能保证数据正确传送到 ... -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
2015-07-23 19:49 2062今天写程序时候,服务器端启动了,然后客户端总是连接不上,con ... -
htons()
2015-07-23 19:26 589在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺 ... -
使用symbolicatecrash分析crash文件
2015-03-10 11:32 1189原文 http://www.cnblogs.com/ning ... -
程序设计中的计算复用(Computational Reuse)
2015-02-10 10:18 673从斐波那契数列说起 ... -
didReceiveMemoryWarning
2015-02-09 16:11 548IPhone下每个app可用的内存是被限制的,如果一个app使 ... -
iOS开发中怎么响应内存警告
2015-02-09 16:08 659好的应用应该在系统内存警告情况下释放一些可以重新创建的资源。在 ... -
ASIHTTPRequest多次重复请求的问题
2014-12-17 14:34 648在一个车票订购的项目中,点击一次订购,却生成了2次订单,通过抓 ... -
从 CloudKit 看 BaaS 服务的趋势
2014-09-26 11:51 731从 6 月份 WWDC 苹果发布 ... -
ios编程--AVCapture编程理解
2014-09-26 11:03 9430、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里 ... -
NSURLProtocol
2014-09-25 10:42 8271、http://nshipster.com/nsurlpro ... -
关于iOS8的extension插件
2014-09-25 10:41 1301关于iOS8的extension插件,有兴趣的同学可以参考一下 ... -
【转】ios app在itunesConnect里面的几种状态
2014-08-05 10:34 1155Waiting for Upload (Yellow) Ap ... -
[转]iOS Dev (45) iOS图标与切片处理工具Prepo
2014-02-07 17:02 1036iOS Dev (45) iOS图标与切片处理工具Prepo ... -
phoneGap开发IOS,JS调用IOS方法/phoneGap插件开发
2014-01-13 17:49 1249前沿 废话不说phoneGap是什么不多介绍,官方网站: h ... -
如何在IOS平台下搭建PhoneGap开发环境(PhoneGap2.5)
2014-01-13 15:23 754由于在下最近在做基于HTML5的跨平台移植,搭建环境的时候着实 ... -
xcode 4 制作静态库详解
2013-12-20 18:27 550最近在做Apple的IOS开发,有开发静态库的需求,本身IOS ... -
【翻译】ios教程-创建静态库
2013-12-20 18:19 3125作者:shede333 主页:htt ... -
iphone:使用NSFileManager取得目录下所有文件(遍历所有文件)
2013-11-18 17:56 878From:http://note.sdo.com/u/xiao ... -
ios7-录音权限访问-AVAudioSession
2013-11-15 19:39 11810///新增api,获取录音权限. 返回值,YES为无拒绝,NO ...
相关推荐
总结,"WPF 自定义控件库 常用控件封装&常用控件样式重写"涉及到的核心技术包括WPF控件的封装、样式重写和控件库的构建,这些都是提升WPF应用界面设计和用户体验的关键手段。通过深入理解和运用这些知识,开发者能够...
Altium库 AD封装库原理图库元器件接插件芯片PCB封装库(AD大全),可供学习及设计参考可直接用于你的项目设计中。 AD个人封装库:发光显示器件.PCBLIB.rar AD个人封装库:基本元件.PcbLib.rar AD个人封装库:常用元件...
本主题聚焦于如何创建一个静态库A,这个库不仅包含自身的代码,还封装了另一个静态库B。这涉及到链接器的工作原理以及如何使用`ar`命令来管理静态库。 ### 静态库的基本概念 1. **静态库(Static Library)**: 静态...
8. **源码封装**:将自定义控件打包成库,便于在多个项目中复用。这需要了解.NET的库项目结构,以及如何发布和引用DLL文件。 9. **调试与测试**:在开发过程中,确保对自定义控件进行充分的测试,检查其在不同环境...
在电子设计领域,Mini PCIe(迷你PCI Express)是一种广泛应用于小型化设备的接口标准,它基于PCI Express协议,提供了一种高效、高速的数据传输方式。本压缩包包含的资源是关于Mini PCIe接口的PCB封装库,对于进行...
本项目是关于如何将MFC与Excel类结合,封装成一个动态链接库(DLL),以便在其他静态库或应用程序中方便地调用Excel功能。 首先,我们需要理解MFC中的类库结构。MFC包含许多预定义的类,如CWinApp、CWnd、CButton等...
在IT行业中,将第三方库封装为OCX(OLE Control Extension)控件是一种常见的技术实践,目的是为了方便在各种应用程序中重用已有的功能模块。在这个案例中,我们讨论的是一个特定的应用场景——视频监控中的多屏显示...
Qt自定义控件库是一个集合了多种自定义控件资源的压缩包,主要针对Qt开发平台,用于丰富和扩展Qt应用程序的用户界面。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动设备以及嵌入式系统的...
【纯SDK封装IE控件源码】是一种技术实践,它涉及到使用Windows SDK(Software Development Kit)来编写代码,而不是依赖于Microsoft Foundation Classes (MFC) 或 Active Template Library (ATL) 这样的高级库来封装...
控件库则是一系列预封装的、可复用的控件集合,通常包括各种常见的用户界面元素,如按钮、表单、菜单、对话框等,以及一些特定用途的控件,如图表、树视图、网格视图等。开源控件库的优势在于,它们不仅可以免费使用...
"不错的winform控件封装库.zip"显然包含了为WinForm应用程序设计的一系列自定义控件,这些控件可能经过了精心的优化和美化,能够提升应用的用户体验并扩展其功能。 这个压缩包中的“net_winform_custom_control”很...
开发者或用户可以通过解压这个文件获取到库的源代码和其他相关资源,以便在自己的项目中集成或定制这些控件。 总的来说,这个轻量级的VC界面控件库mCtrl是一个用于Visual C++开发的增强GUI功能的工具集,它包含了一...
在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和动态库(dynamic libraries)。这两种库各有其优势和...
标题 "7z压缩接口封装成控件" 涉及的核心技术是将7-Zip的压缩功能集成到自定义的控件中,以便在应用程序中方便地使用7-Zip的压缩和解压缩功能,而无需用户在系统中安装7-Zip软件或7Z.DLL动态链接库。这一过程涉及到...
在.NET框架下,C#是一种强大的编程...通过深入研究这些文件,开发者可以学习到如何构建自己的自定义控件,以及如何在实际项目中应用它们。无论是初学者还是经验丰富的开发者,这个资源库都能提供宝贵的学习和参考材料。
iPhone手机元件库是Axure中一个重要的资源集合,它包含了一系列预设的、与苹果iPhone设备相关的组件和控件,使得设计师可以快速构建出符合iOS界面规范的原型。 在"axure iphone手机元件库原型库"中,我们可以找到...
本项目提供的"VC树形控件 自己封装的树形控件拓展类"是作者对CTreeCtrl进行的自定义扩展,旨在提供更便捷的功能和更高效的开发体验。 1. **类继承**: - 在C++中,通过继承可以创建一个新的类,这个新类将拥有父类...
**基于JQueryEasyUI类库的WebForm控件库** ...通过深入理解并熟练运用这个控件库,开发者可以创建出既美观又功能强大的Web应用程序。同时,提供的源码和示例代码为学习和调试提供了便利,有助于进一步提升开发技能。
4. 自定义封装:对于找不到合适封装的元件,设计师可以创建自己的封装,并将其保存到库中,供未来项目使用。 总结来说,"Altium Designer PCB封装库大全pcb封装库"是一个包含丰富PCB元件封装资源的集合,对于进行...
在本篇文章中,我们将深入探讨如何使用Qt库进行树形控件的封装,以及如何结合数据库来展示和操作数据。首先,我们需要了解Qt库及其核心概念。 Qt是一个跨平台的C++应用程序开发框架,广泛应用于桌面、移动和嵌入式...