iOS最火的开源项目

因为转发的博客没有标注原文地址,所以只能标注二道贩子的地址啦 转自http://xiaonanxia.cnblogs.com/原文作者得知可通知我修改

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目已经被弃用,即使曾经的它很受开发者喜爱,有的项目则继续发扬光大,新项目更是层出不穷。在本文中,我们将继续为大家介绍20个在GitHub上非常受开发者欢迎的iOS开源项目,在这些项目中,有哪些是你经常使用的?又有哪些是你曾经使用过的?

21.SSToolkit

SSToolkit可以说是iOS开发者最常使用的工具类之一,该开源项目提供了一个完整的iOS类库集合,用于解决iOS开发者在开发过程中常碰到的一些问题,比如追踪一款设备是否具有视网膜显示屏或是否能剪裁图片,包含SSCollectionView、SSGradientView、SSSwitch等诸多非常方便的类。

如果想要对SSToolkit作进一步了解,可以在iPad/iPhone上使用SSToolkit的Demo应用SSCatalog。获取更多信息,可直接登陆S.S. TOOLKIT

22.XMPPFramework

XMPPFramework是一个使用Objective-C编写的用于Mac/iOS开发的XMPP框架,它提供了一个RFC-3920(XMPP标准)核心实现,通过某些特定工具读写XML。XMPPFramework有着非常丰富的建立在模块化架构之上的XEP扩展,开发者可以将其直接插入到代码中,使用GCD构成,即使是在非常老旧的iPhone或12核Mac Pro上,它都能高效运转。

23.MGSplitViewController

为了方面开发,苹果iOS SDK提供了UISplitViewController用于iPad左右分栏界面显示,但对于开发者而言,UISplitViewController使用起来并不方便,在开发过程中,总会遇到许多问题。于是,天才的iOS开发者Matt Gemmell在GitHub上发起了一个名为MGSplitViewController的开源UISplitView实现,它比苹果官方UI组件所提供的分栏类功能更加丰富。

最初Matt编写MGSplitViewController只是为了方便自己使用,但最终Matt决定将其开源,供所有iOS开发者使用。如果想要了解更多关于MGSplitViewController的信息,可直接登陆Matt Gemmell博客查看,也可点击链接,查看视频演示(需)。

24.CocoaLumberjack

CocoaLumberjack集快、简单、强大、灵活于一身,和log4j等其他非常受开发者欢迎的日志框架的概念类似,专为Objective-C设计,用于iOS和Mac,拥有多线程、GCD(如果可用)、无锁原子操作和Objective-C运行时的动态特性。

25.PSTCollectionView

PSTCollectionView是用于iOS 4.3及其以上版本中的UICollectionView的100%开源API兼容替代品。如果想要使用UICollectionView,但仍然需要支持老版本的iOS,那么这个项目你一定会非常喜欢。如果想要始终使用PSTCollectionView,使用PSTCollectionView作为类名称即可。

当然,如果你想在iOS 4.3/5.x上使用PSTCollectionView,但在iOS 6上使用UICollectionView,可以在所有UICollectionView类上添加PS,以获得对老版iOS的自动支持,这样就可以随心所欲如你所愿地使用PSUICollectionView。

26.CocoaHTTPServer

CocoaHTTPServer是一个用于Mac OS X或iOS应用的轻量级、可嵌入的HTTP服务器框架。有时候开发者需要在他们的App中内嵌一个HTTP服务器。无论是具有远程监控功能的服务器应用,还是使用HTTP进行后端通信的桌面应用,或者是提供无线访问文档功能的iOS应用,CocoaHTTPServer都能满足你的开发要求。

CocoaHTTPServer提供如下功能:

  • 支持Bonjour广播内建;
  • 支持IPv4、IPv6;
  • 异步网络使用GCD和标准套接口;
  • 密码保护支持;
  • SSL/TLS加密支持;
  • 快速、高效;
  • 伸缩性强;
  • 大量注释代码;
  • 非常容易扩展;
  • 还支持WebDAV。

27.PushSharp

在应用开发中,给App推送通知是很常见的方式。PushSharp正是这样一个能够实现向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows Phone、Windows 8、BlackBerry(PAP)和Amazon(ADM)等多种操作系统推送消息通知的开源C#服务器端库。

主要特性:

  • 支持多平台消息推送;
  • API能够很流畅地为不同平台创建通知;
  • 自适应信息频道(自动增加或减少消息链接);
  • 使用异步代码,基于Event为导向调用类库;
  • 100%代码托管,兼容Mono框架;

28.HockeyKit

此前在GitHub上“最受欢迎的Android开源项目”系列文章(一)中,我们曾对HockeyKit进行了详细的介绍。HockeyKit是一个用于iOS和Android下App更新的开发包,无论是iOS还是Android应用开发,它都深受开发者喜爱。

29.JTRevealSidebarDemo

JTRevealSidebarDemo是一个能够实现类似于Facebook客户端和Path应用的视图切换效果的Objective-C库模板,其目的在于为开发者提供一个真正灵活的、可重用的解决方案。

JTRevealSidebarDemo可用于iOS 4.3和5.0应用开发,示例代码使用ARC构建,但该库本身则兼容ARC和非ARC。

30.PKRevealController

PKRevealController是对ZUUIRevealController的进化,ZUUIRevealController能够实现类似于Facebook客户端的视图横向切换效果。而PKRevealController则是一个iOS视图控制器的集合,能够让你实现多重控制器切换,非常灵活。

31.QuincyKit

QuincyKit是一个为iOS和Mac OS X提供的程序崩溃报告管理解决方案,提供客户端开发包以及基于PHP开发的服务器平台。

主要功能:

  • (自动)向开发者数据库发送崩溃报告;
  • 由用户决定每次崩溃是否发送数据或总是发送;
  • 用户可对是否选择提供E-mail地址等额外信息进行设置;
  • 如果崩溃是已知的,向用户提供即时反馈,并在接下来的更新中进行修复。

详情请参考:QuincyKit官网

32.PSStackedView

PSStackedView能够将你的UIViewControllers堆叠起来,实现了类似于Twitter iPad版应用效果的界面,项目发起人Peter Steinberger表示,PSStackedView的灵感正是来自于Twitter iPad的UI。

为了开发非常受欢迎的奥地利TV应用“3MobileTV”的iPad版,Peter创作了PSStackedView,开发者可以直接登陆App Store下载该应用。PSStackedView可运行在iPad和iPhone上,但相对而言,更适合用在iPad上。

33.Chameleon

作为一名iOS开发者,你应该对苹果官方用于开发iPhone、iPod和iPad应用的UIKit框架很熟悉。Chameleon是一个完全独立的可以直接替代UIKit在Mac OS X上运行的框架,和UIKit唯一的共性就是公共类和方法名称。在大多数情况下,开发者不需要改动任何代码,即可直接在Mac上运行所开发的iOS应用。

Chameleon的源代码是基于苹果的文档而来,并没有使用到任何私有API或其他未经Mac App Store批准的技术。如果想要了解更多关于Chameleon的信息,可直接登陆ChameleonProject网站查看。

34.cocos2d-iphone-extensions

Cocos2D-iPhone-Extensions整合了非常多的优秀的Cocos2D-iPhone引擎第三方扩展。该项目并没有对Cocos2D进行任何改变,只是将新功能源源不断地加入到Cocos2D-iPhone-Extensions中,供开发者使用。

35.DCIntrospect

Introspect是一个很小的iOS工具集,用于帮助开发者对使用UIKit构建的用户界面进行调试。特别适用于动态创建UI布局、改变运行时,还能通过寻找透明视图优化应用性能,并避免不必要的重绘视图。

36.PSCollectionView

PSCollectionView是一个能够实现Pinterest风格的瀑布流视图显示效果的iOS滚动组件,可用于类似的UITableView,支持显示图片和文字。

项目发起人Peter Shih在自己的iPhone/iPad应用Lunchbox中使用了PSCollectionView源代码,开发者可以在App Store中免费下载该应用。

37.SDURLCache

NSURLCache及其子类提供了很多高级接口用于处理缓存,但如果你想在自己的iPhone应用中通过HTTP请求的方式将缓存存储到磁盘中,推荐使用SDURLCache。Peter Steinberger在GitHub上托管的这个SDURLCache项目是Olivier Poitrey的SDURLCache的一个分支,支持iOS 5以下版本系统。

38.FastPdfKit

该开源库包含着FastPdfKit iOS库的一些示例项目。FastPdfKit是一个能够让你在iOS应用中显示PDF文档的开发类库,其最大的特点就是加载PDF文档速度特别快。

详情请参考:FastPdfKit官网

39.KKGridView

KKGridView是一个高性能的iOS表格组件,但自WWDC 2012大会上苹果推出了相关的解决方案之后,KKGridView也就逐渐停止使用了。每逢iOS系统更新,iOS开源项目势必也会发生新一轮的改变,至于在颠覆了苹果以往设计观的iOS 7发布之后,iOS开源项目又会发生哪些改变?还要看天才的开发者们!

40.MGBox2

MGBox2能够实现非常酷的列表交互效果,使用最少代码,即可快速创建各种布局效果的iOS表格、网格,支持新增和删除网格,动态添加或删除列表,在表格中加入多行文字、图片等,支持手势识别和自定义事件。

posted @ 2014-02-13 11:35 孤海傲月 阅读(6) 评论(0)编辑

(转)直接拿来用!最火的iOS开源项目(一)

1.AFNetworking

在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库。它建立在NSURLConnection、NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单,因此,许多iOS应用开发都会使用到它。

  • 支持HTTP请求和基于REST的网络服务(包括GET、POST、PUT、DELETE等);
  • 支持ARC;
  • 要求iOS 5.0及以上版本;
  • 有一些插件扩展已有的功能,还有一个功能齐全的API;
  • 从URL中获取JSON特别简单。

详情请参考:AFNetworking官网

2.Three20

Three20原本是iPhone版Facebook中所使用的工具库,包括照片查看器等一系列的iPhone UI类集,以及HTTP磁盘缓存等一些通用工具。后来从Facebook iPhone应用中剥离出来,成为了一个深受开发者喜爱的通用框架。

3.facebook-ios-sdk

此前在“GitHub上最受欢迎的开源项目”Android系列文章(一)中,我们曾介绍过允许开发者将Facebook集成到Android应用中的Facebook SDK for Android。Facebook SDK for iOS和它一样,可以让开发者将Facebook相关功能集成到自己的iOS App中。

Facebook无疑是最成功的SNS社区,如果能够让App具有与Facebook集成的功能,那势必会带来非常好的效果。Facebook SDK for iOS项目更新频率很高,想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。

4.RestKit

Restkit是一个主要用于iOS上网络通信的开源Objective-C框架,除了发送请求、接受响应这些基本功能外,还附带Core Data,以及将远程JSON映射为本地对象的功能。

主要特点:

  • 可在iOS和Mac OS X的Objective-C中与RESTful Web服务进行简单交互;
  • 包含简单的HTTP Request/Response API;
  • 带有强大的对象映射系统,用于减少代码长度;
  • RestKit可降低JSON/XML的处理的资源消耗,支持通过SBJSON和YAJL进行JSON解析。

详情请参考:Restkit

5.asi-http-request

ASIHTTPRequest是一款极其强劲的HTTP访问开源项目,能够让简单的API完成非常复杂的功能,比如异步请求、队列请求、GZIP压缩、缓存、断点续传、进度跟踪、上传文件、HTTP认证。

ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。使用Objective-C编写,能够同时用于Mac OS X和iPhone应用中。

详情请参考:all-seeing.ASIHTTPRequest

6.cocos2d-x

在《直接拿来用!最火的Android开源项目(一)》中,我们已经非常详细地介绍了cocos2d-x开源项目。cocos2d-x支持iOS、Android、Windows Phone 8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。

详情请参考:cocos2d-x

7.cocos2d-iphone(cocos2d)

cocos2d for iPhone是一个开源框架,用于为iPod Touch、iPhone、iPad及Mac OS X构建2D游戏、演示程序及其他图形交互式应用。基于cocos2d设计,使用相同的API,但不同于cocos2d使用Python,cocos2d for iPhone是使用Objective-C实现的。

cocos2d for iPhone主要特性:

  • 免费
  • 易于使用
  • 社区支持

详情请参考:cocos2d-iphone

8.cocos2d-iphonejpsarda

该项目是对cocos2d for iPhone的扩展。

9.GPUImage

GPUImage是一个基于GPU图像和视频处理的开源iOS框架。

主要功能如下:

  • 提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜;
  • GPUImage顾名思义,是基于GPU的图像加速,因此图像处理速度非常快,并且能够自定义图像滤镜;
  • 支持ARC。

10.MonoGame

MonoGame是一个Microsoft XNA 4.x Framework的开源跨平台实现。此前在Android开源项目系列文章(一)中我们也进行了详细的介绍。

MonoGame支持平台:

11.Nimbus

Nimbus是一个开源的iOS框架,比起Three20,Nimbus的文档更为全面、丰富,能够实现很多非常炫的界面特效。因此,开发者可以借助Nimbus来降低项目设计的复杂度。

12.cheddar-ios

Cheddar是一个简单即时的任务管理器,Cheddar for iOS是Cheddar的iOS客户端,通用于iPhone和iPad。

开发者可以直接登陆App Store下载该应用。

13.ViewDeck

IIViewDeckController能够实现类似于Path 2.0 的视图左右滑动的效果,支持向左或向右顺滑的滑动操作。

点击链接,查看视频演示(常规演示灵敏性演示),注意,需的哟。

14.ShareKit

ShareKit是iPhone开发的第三方接口,允许你一键分享文字、图片、网址、文件等内容到Facebook、Twitter、Delicious、Tumblr、Google Reader等第三方网站上。

详情请参考:getsharekit

15.GMGridView

GMGridView是一款开源的iOS(iPhone/iPad)表格视图,允许用户手势对表格单元进行排序,在单元格需要展示时才进行装载,这样极大地提高了表格的效率。其中的伸缩/旋转/平移手势能够让用户改变视图,还能够实现从CellView到全屏的切换。

详情请参考:gmoledina

16.QuickDialog

QuickDialog可以帮助开发者快速创建复杂的表单,实现包括登录界面在内的各种样式的TableView输入界面,此外,还可以创建带有多个文本域的表格及项目。

开发者可以直接登陆QuickDialog官方网站,获取更多信息或文档。

17.appirater

Appirater是一个可以直接使用到任何iPhone应用(iOS4.0及以上)中的开源类,用于提醒用户在打开App时,对应用进行评论或打分。

详情请参考:Appirater group

18.SVProgressHUD

SVProgressHUD能够实现多种HUD效果,多用于程序正在执行耗时较长的任务,需要用户等待。除了显示等待的HUD,还可以显示命令执行成功或者失败的HUD。

19.Reader

该项目能够让iOS开发者轻而易举地在iOS设备屏幕上显示PDF文件。代码通用,不需要任何XIB(因为所有UI元素都是代码生成的,具有极大的灵活性),运行于iOS 4.0及其以上版本设备中,同时还支持所有Retina Display设备。

支持:

  • 诸如iBooks等的文档导航;
  • 设备全方位旋转;
  • 对PDF进行加密(密码保护);
  • PDF链接(URI及跳转页面);
  • PDF旋转页面。

20.CocoaAsyncSocket

CocoaAsyncSocket提供了十分强大而又易用的Mac OS X及iOS异步套接库,支持TCP和UDP,其中,AsyncSocket类是支持TCP的,AsyncUdpSocket是支持UDP的。

AsyncSocket是封装了CFSocket和CFSteam的TCP/IP socket网络库,提供异步操作。AsyncUdpSocket是UDP/IP socket网络库,包装自CFSocket。

以上为GitHub上最受欢迎的iOS开源项目TOP20,敬请期待GitHub上最受欢迎的iOS开源项目系列(二)。

posted @ 2014-02-13 11:33 孤海傲月 阅读(7) 评论(0)编辑

<iOS>other linker flags[转]

包含静态库时候需要在Target的Other linker flags里面加上值:-objC,-all_load,-force_load

对于64位机子和iPhone OS应用

解决方法是使用-all_load或者-force_load。

-all_load强迫链接器从它能看见的所有文档中加载所有的对象文件,甚至那些没有OC代码的文档。

-force_load适用于Xcode3.2+版本,它允许finer得到文档加载的控制。每一个-force_load操作必须跟着一个文档路径,文档中的每一个对象文件将会被加载。

-all_load就是会加载静态库文件中的所有成员,

-ObjC就是会加载静态库文件中实现一个类或者分类的所有成员,

-force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员。

举个例子

当链接一个包含类别的OC静态库时候,将会得到一个运行时异常:"selector not recognized"。你需要设置Other Linker Flags的值为-ObjC就OK了

posted @ 2014-02-13 09:45 孤海傲月 阅读(5) 评论(0)编辑

iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]

在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView

在以前,一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。

在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法:

@property(nonatomic,readonly) NSArray *childViewControllers

- (void)addChildViewController:(UIViewController *)childController

- (void) removeFromParentViewController

- (void)transitionFromViewController::::::

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent

这样,就能够将一个页面中的UIViewController控制起来,而不是混乱的共用一个UIViewController
,最重要的是,编程习惯的革命: 降低了功能的耦合度!
写这篇博客,仅仅是讲以上5个方法!仅此而已。因为当我在百度或者谷歌中,输入以上5个方法的名字后,查出来的,并没有告诉这5个方法起到如何的作用?如何使用?
所以,我仅仅是想从API角度来谈一谈,这5个方法。
废话不多说了!
先搞清楚一个今天提到的概念:

[父视图控制器addChildViewController:子视图控制器];

在此, 图控制器A添加了另一个 图控制器B,那么A充当父视图控制器,B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。
addChildViewController方法:

- (void)addChildViewController:(UIViewController *)childController

向视图控制器容器中添加子视图控制器

childController:子视图控制器

当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。

removeFromParentViewController 方法

- (void)removeFromParentViewController

从父视图控制器中删除。

transitionFromViewController 方法

- (void)transitionFromViewController:(UIViewController *)fromViewControllertoViewController:(UIViewController *)toViewControllerduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animationscompletion:(void (^)(BOOL finished))completion

交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)

fromViewController:当前显示的子试图控制器,将被替换为非显示状态

toViewController:将要显示的子视图控制器

duration:交换动画持续的时间,单位秒

options:动画的方式

animations:动画Block

completion:完成后执行的Block

willMoveToParentViewController 方法

- (void)willMoveToParentViewController:(UIViewController *)parent

当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用

parent:父视图控制器,如果没有父视图控制器,将为nil

注意点:

1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:

[将要删除的视图控制器willMoveToParentViewController:nil];

2.当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。

didMoveToParentViewController 方法

- (void)didMoveToParentViewController:(UIViewController *)parent

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

parent:父视图控制器,如果没有父视图控制器,将为nil

当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。

removeFromParentViewController方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。

其实,这几个方法中的API说明,看的还懂。
最后,
关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

1.这两个方法用在子试图控制器交换的时候调用!即调用transitionFromViewController 方法时,调用。
2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时,要注意他们的参数使用:
当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。
即:[ 将被删除的子试图控制器willMoveToParentViewController:nil];
当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。
即:[将被加入的子视图控制器didMoveToParentViewController:父视图控制器];
3.无需调用[子视图控制器willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器addChildViewController:子视图控制器]时,已经默认调用了。
只需要在transitionFromViewController方法后,调用[子视图控制器didMoveToParentViewController:父视图控制器];
4.无需调用[子视图控制器didMoveToParentViewController:父视图控制器]方法。因为我们调用
[子视图控制器removeFromParentViewController]时,已经默认调用了。
只需要在transitionFromViewController方法之前调用:[子视图控制器willMoveToParentViewController:nil]。

posted @ 2013-07-15 22:13 孤海傲月 阅读(55) 评论(0)编辑

[原创]手把手教你如何把二维码插件zxing加入到android和ios项目中

由于最近项目的需要,特别整理了二维码扫描的ios版和android版本的搭建过程,下面的链接里面包括了说明文档以及项目源码,下载地址为:

http://files.cnblogs.com/xiaonanxia/%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%AE%80%E5%8C%96%E5%AE%9E%E4%BE%8B%E4%BB%A3%E7%A0%81.zip

posted @ 2013-05-30 09:14 孤海傲月 阅读(48) 评论(0)编辑

Zxing 扫描码的ios简化版搭建过程

(一)什么是zxing

ZXing(发音为斑马线)是一个开放源码的,多种格式的1D/2D条码图像处理库,用objective-c实现的,与其他语言的端口。我们的重点是使用内置的摄像头在手机上的条形码进行扫描及解码的设备,不与服务器通信。该插件可以只支持扫描二维码,不支持条形码扫描

(二)本实例说明

用一般网上的关于如何把zxing引入到你的ios代码中都会要求先从官网中下载最新的源码,然后根据网上给出的步骤一步步操作,但是因为官网的源码是会不断更新的,这就导致了一个问题,那就是如果你下载的版本和网上的例子中用到的官方源码版本不一致,那么在按照他的步骤讲解的过程中,有可能会出现局部地方的不同,让自己摸不着头脑,甚至会出现莫名其妙的错误,而自己又不知道如何解决。所以,在本示例中,如果你想把zxing相关的代码加到你的项目中,使之可以支持二维码扫描,那么你就从demo中拷贝就可以了,下面会有详细的讲解,这样教程和官方源码就对应了,也就容易操作了。本代码支持ios5.0以及以上,5.0以下不支持。

(三)示例代码的演示以及代码的简单讲解

1.大体用法:运行我们的demo,会出现一个界面,上面有一个‘Zxing扫描’按钮,点击一下,会跳转到另一个界面,通过这个界面进行二维码的扫描,扫描成功之后,会把成功的信息返回到第一个页面,我们就得到了这个二维码的信息。

如图所示:

2.调用代码说明:

Demo代码中,起始类是ViewController.mm,当点击扫描按钮的时候,调用的是方法:

然后调用的是ZXingWidgetController这个类,也就是说这个类是与用户交互的类,如果根据项目来进行调整的话,就需要修改这个类。这个类的位置在如图所示:

箭头指向的两个类就是扫描二维码的与用户交互的两个类,其中ZXingWidgetController是控制器类,OverlayView是视图类,控制显示Camera的外观,到时候根据项目需要进行调整的话可以修改这个类。

(四)如何把zxing引入到你的文件中

1)关于zxing源码的结构

如图所示,

它实现的功能比较多,具体实现的功能以及源码的研究可以参考API文档,而在这里我们只需要一小块功能,就是扫描出网址来就可以了。

2*)如何引入zxing

我们已经看到了那个调用二维码的demo了,如果我们想在我们自己的项目中使用二维码扫描功能,只需要把这个demo里的部分内容加入到我们自己的项目中。具体步骤如下:

步骤一

扫浏览示例代码testZxing,看到如下的文件夹:

箭头指向的就是从官网中简化出来的扫描源码。里面有两个文件夹iphonecpp,其中iphone文件夹中有ZXingWidget.xcodeproj,,这个一会加到你的项目中。

首先做的是复制zxing文件夹(箭头方向的)copy到你的项目中,请确保是与工程在同级目录中,这里的作用是以后在项目中找headersearchpath更方便。比如下图:

testZxing是你的项目,那么zxing放在与你项目的同级目录中。

然后,你需要将ZXingWidget.xcodeproj拖拽到你的项目中,如图

比如ZxingTest是你的项目,那么这样拖过来即可。

步骤二:

TARGETS中的BuildPhases中加入依赖关系和要加入的库,请对照下面的文件将TargetDependenciesLinkBinarywithLibraries中内容点击“+”号:

首先是在TargetDependencies中加入ZXingWidget,如图所示:

然后再在LinkBinaryWithLibraries中加入libZxingWidget.a,如图所示:

步骤三:

在BuildSetting选项卡中加入HeaderSearchPaths(这里解决的问题是设置我们引用的类的头文件的路径,否则会出现找不到头文件的错误,”./”表示的是当前目录,这样在以后移动工程的时候我们就不用再重新设置搜索头),如图所示:

我们需要在HeaderSearchPaths中添加几项,如图所示:

照着图写上这些代码即可。这样我们在调用类库中的头文件的时候就不会出现找不到头文件的错误了。

步骤四:

现在编译一下你的项目,看看是否出现错误,如果没有错误,进行下面的步骤,如果出现错误,仔细看上面的步骤,看是否哪里有不一致,在进行修改。

步骤五:

现在开始实际调用扫描码的测试代码。

1.浏览一下示例代码中ViewController.mm中的代码,在你自己的代码的适当的地方加上如下代码:

ZXingWidgetController*widController=[[ZXingWidgetControlleralloc]initWithDelegate:selfshowCancel:YESOneDMode:NO];

NSMutableSet*readers=[[NSMutableSetalloc]init];

QRCodeReader*qrcodeReader=[[QRCodeReaderalloc]init];

[readersaddObject:qrcodeReader];

widController.readers=readers;

[selfpresentViewController:widControlleranimated:YEScompletion:^{}];

很容易理解,就是点击‘扫描’之后,调用zxing的扫描控制器。

别忘了让你的项目继承<ZXingDelegate>委托,这是扫描完成之后的回调委托。

2.你会发现会报错,因为你需要引入几个头文件,在ViewController.h中,

#import<ZXingWidgetController.h>#import<AVFoundation/AVFoundation.h>#import<QRCodeReader.h>

然后看看是否能通过编译。

3.如果那你发现仍然通不过编译,并且错误是iostreamfilenotfound

那么你需要把你引用ZXingWidgetController的类的结尾的.m改为.mm,

如同示例一样。这是因为iostream是c++的文件,当你调用他们的时候,需要改一下

文件名的结尾才能调用。

4.此时如果还是报上面的错误,那么剪切#import<QRCodeReader.h>,然后粘贴到结尾为mm的类中即可(具体原因不是很清楚,应该是与c++机制有关)

5.再次编译项目,会发现依然报错,但是这次的错误不再是iostreamfilenotfound

如果你遇到如图类似的错误:

说明我们少引用了一些类库,比如音频播放文件等,具体的你也不需要知道要引用哪一些,只需照着demo中的引入的类库,缺少的都引入。如图所示:

照着挨个引入即可。引入之后看看是否还报错。

6.经过了重重劫难,看看是否还报错呢。

我晕,依然报错,你的这次错误是不是如图所示的呢?

一看就是c++上报的错误,不过不用担心,我们有解决的方法。

将你项目中的AppleLLVMcompiler4.1-language中的cLanguageDialectc++LanguageDialectc++standardLibrary设置成下图所选的值:

然后在编译下,看看是否有错

7,大功告成,经过以上步骤,应该是可以使用二维码的扫描功能了,如果你依然出现错误,那么仔细检查每个步骤,看看哪里没有进行相应的修改。笔者在写这篇文档的时候,又照着这个步骤新建了一个,可以成功调用。不过前提是要ios5.0及其以上。

posted @ 2013-05-30 09:00 孤海傲月 阅读(450) 评论(3)编辑

UIWebView加载本地HTML文件[转]

一.准备HTML文件及其资源文件

使用UIWebView加载本地的HTML文件 index.html,在index.html中引用了本地的图片、CSS文件、JS文件以及外部的图片。index.html内容如下

<html>
    <head>
        <link href="index.css" rel="stylesheet" type="text/css">
        <script type="text/javascript"language="javascript"src="index.js"> 
    </head>
    <body>
        <p>This is local Image</p>
	<img src="Smiley.png" width="50" height="50" />
        <hr/>
        <p>this is local image from CSS.</p>
	<div id="myimage"></div>
	<hr/>

        <p>this is external image.</p>
	<img src="http://imglf9.ph.126.net/F37NyhuzmvHJChMARbFmHA==/1010495166409149719.jpg" width="300" height="200" />
    </body>
</html>

HTML中会显示3张图片,第一张是html从本地读取的图片,第二张是通过CSS从本地读取的图片,第三张是通过绝对地址从外部读取的图片。index.css文件内容如下:

body {
    padding: 0px;
    margin: 0px;
}
p {
    font-size: 15px;
    color: #808080;
    font-family: Arial, Helvetica, sans-serif;
}  

#myimage {
    background-image: url(SmallSmiley.png);
    background-repeat: repeat-x;
}

index.js文件内容为:

function rewrite()
{
    document.write("This text was written by an external script!")
}

index.js还有引用到了两个本地图片文件:SmallSmiley.pngSmiley.png

二.加载本地HTML文件

将html文件及相关资源添加到项目中需要注意的是,把js文件加入到项目时会默认将其当做需要编译的代码,需要在TARGETS->Build Phases中的”Compile Sources”中找到该js文件,并将其移到上面的Copy Bundle Resources中。

然后在代码中可以用两种方法加载。 1.第一种方式,使用loadRequest:方法加载本地文件NSURLRequest

NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL* url = [NSURL fileURLWithPath:path];
NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
[webView loadRequest:request];

2.第二种方式,使用loadHTMLString:baseURL:加载HTML字符串

NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:html baseURL:baseURL];

加载后的显示效果如下,本地图片,CSS加载的本地图片,以及外部图片都可以正常显示。

在HTML页面加载完毕后,我们可以使用UIWebViewstringByEvaluatingJavaScriptFromString:方法执行javascript语句。如下:

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    [webView stringByEvaluatingJavaScriptFromString:@"rewrite();"];
}

执行js代码后,页面显示就变成了

三.关于baseURL

loadHTMLString:baseURL:方法的第二个参数是baseURL,baseURL即HTML字符串中引用到资源的查找路径,没有引用外部资源时,可以直接传nil;若引用了外部资源,一般情况下使用mainBundle的路径即可,即

NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];

这是因为,Xcode项目中的文件路径都是虚拟的,在APP中实际不存在,即在APP中,几乎所有的文件都可以从mainBundle根目录下直接访问,当然,例外总是存在的。

在将文件/文件夹加入到项目时,有这样两个选项“Create Folder References for any added folders”和“Recursively create groups for any added folders”。默认情况下为第一种,即所有加入到项目的文件都会在mainBundle根路径下,即不管加入项目的文件的目录结构如何,在APP中都可以通过mainBundlePath/filename来访问到;如果采用第二种方式,则就会保留相对路径,需要通过mainBundlePath/path/filename来访问。通过这两种方式到项目的文件夹显示具有不同的颜色,如下images1目录是使用“Create Folder References for any added folders”增加的目录,images2目录是使用“Recursively create groups for any added folders”增加的目录。

获取images1目录下文件的代码如下:

NSString* image1Path = [[NSBundle mainBundle] pathForResource:@"image1"ofType:@"jpg"];
NSString* image11Path = [[NSBundle mainBundle] pathForResource:@"image11"ofType:@"jpg"];

images1和images11目录实际是不存在的,下面代码返回的路径都是nil

NSString* images1Dir = [[NSBundle mainBundle] pathForResource:@"images1"ofType:nil];
NSString* images11Dir = [[NSBundle mainBundle] pathForResource:@"images11"ofType:nil];

对于images2目录以及目录下的文件路径,其在APP中仍然保持了目录关系,就不能用上述方法获取,而且目录路径是真实存在的,应该使用的代码如下:

NSString* images2Path = [[NSBundle mainBundle] pathForResource:@"image2"ofType:@"jpg"inDirectory:@"images2"];
NSString* image22Path = [[NSBundle mainBundle] pathForResource:@"image22"ofType:@"jpg"inDirectory:@"images2/images22"];
NSString* images2Dir = [[NSBundlemainBundle] pathForResource:@"images2"ofType:nil];
NSString* images2Dir = [[NSBundle mainBundle] pathForResource:@"images22"ofType:nilinDirectory:@"images2"];

还有一种比较特殊的目录是以.bundle为后缀的目录,将其加入到项目是不管选择的是哪个选项,其都会保持其目录结构。对子bundle的访问,可以通过同images2目录相同的方法访问,但一般情况下是先获取到子Bundle,再通过子Bundle获取到其里面的资源。

NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"images" ofType:@"bundle"]];
NSString* imagebPath = [bundle pathForResource:@"imageb"ofType:@"jpg"];
NSString* imagebbPath = [bundle pathForResource:@"imagebb"ofType:@"jpg" inDirectory:@"imagesb"];

posted @ 2013-05-30 08:56 孤海傲月 阅读(495) 评论(0)编辑

解决通过Intent调用系统拍照程序,返回图片太小的问题[android] 【转】

以下的代码可以调用系统的拍照程序,

1
2
Intent it = newIntent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);

按下拍照键后,会返回到你的activity,所以你的activity要在onActivityResult方法里加一个处理,

1
2
3
4
5
6
7
8
9
10
11
12
13
protectedvoidonActivityResult(intrequestCode, intresultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try{
Bundle extras = data.getExtras();
Bitmap b = (Bitmap) extras.get("data");
take = b;
ImageView img = (ImageView)findViewById(R.id.image);
img.setImageBitmap(take);
}catch(Exception e){
}
}

但是这样你会发现这个bitmap尺寸太小了。明显是被压缩过了,要像返回未被压缩的照片,那么你要给调用系统拍照程序intent加上参数,指定图片输出的位置。

1
2
3
Intent it = newIntent("android.media.action.IMAGE_CAPTURE");
it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(newFile(F.SD_CARD_TEMP_PHOTO_PATH)));
startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);

这样就是大图片返回了。

1
2
3
4
5
6
7
8
9
10
11
12
protectedvoidonActivityResult(intrequestCode, intresultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try{
ImageView img = (ImageView)findViewById(R.id.image);
take = U.ResizeBitmap(U.getBitmapForFile(F.SD_CARD_TEMP_PHOTO_PATH), 640);
img.setImageBitmap(take);
imgflag = true;
}catch(Exception e){
}
}

另外注意一下,返回的那个bitmap会很大,你用完以后要把它回收掉,不然你很容易内存报oom错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
publicstaticBitmap ResizeBitmap(Bitmap bitmap, intnewWidth) {
intwidth = bitmap.getWidth();
intheight = bitmap.getHeight();
floattemp = ((float) height) / ((float) width);
intnewHeight = (int) ((newWidth) * temp);
floatscaleWidth = ((float) newWidth) / width;
floatscaleHeight = ((float) newHeight) / height;
Matrix matrix = newMatrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// matrix.postRotate(45);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
bitmap.recycle();
returnresizedBitmap;
}

posted @ 2013-04-24 17:17 孤海傲月 阅读(39) 评论(0)编辑

苹果企业证书过期-描述文件过期的方案 【转】

苹果开发证书分为个人证书和企业证书。两者其中一个区别是,企业证书打包的app不需要发布到app store,而个人证书的app必须发布到app sotre。但是企业证书有个弊端,使用企业证书发布app有效期为12个月,假如过了有效期app则无法运行。也就是说,企业证书发布的app至少需要 1年升级一次,每次升级使用新的证书来发布。

这真是一个大坑。


下面是苹果官方文档的说明(http://help.apple.com/iosdeployment-apps/mac/1.1/?lang=zh-cn#app43ad802c):


您自己分发的应用程序不会自动更新。当您有新版本可供用户安装时,向他们发送更新通知并指导他们安装应用程序。考虑让应用程序检查更新,并在它打开时通知用户。如果您使用的是无线应用程序分发,则通知可以提供已更新应用程序的清单文件链接。

如果您想要用户保留他们的设备上储存的应用程序数据,请确定新版本使用的 bundle-identifier 与它要替换的 bundle-identifier 相同,并告知用户在安装新版本之前不要删除他们的旧版本。新版本将会替换旧版本并保留设备上储存的数据,前提是 bundle-identifier 匹配。

分发预置描述文件自签发之日起 12 个月后过期。过期之前的两个月,iOS 设备会开始显示即将过期通知。过期之后,应用程序将无法开启。

请在预置描述文件过期之前,使用 iOS Development Portal(iOS 开发门户)为应用程序创建新描述文件。使用新预置描述文件为首次安装应用程序的用户创建新应用程序归档 (.ipa)。

对于已经拥有该应用程序的用户,您可能想要计划发布下一个版本的时间,以便它包括新预置描述文件。如果您不想这样做,则可以仅分发新 .mobileprovision 文件,以便用户不必再次安装该应用程序。新预置描述文件将覆盖已存在于应用程序归档中的描述文件。

现在,您可以使用 MDM 安装和管理预置描述文件,用户可以从您提供的安全网站上下载和安装它,或者您可以将它作为电子邮件附件分发给用户,供用户打开和安装。

您的分发证书过期后,应用程序将无法开启。分发证书自签发之日起三年有效,或者在您的 Enterprise Developer Program(企业级开发者计划)成员资格过期之前一直有效,过期日期以先到者为准。若要防止证书提前到期,请确保在成员资格过期之前续订它。有关如何 检查分发证书的信息,请参阅证书验证

您可以同时让两个证书处于活跃状态,它们之间相互独立。第二个证书是为了提供一个重叠期,让您能够在第一个证书过期前更新您的应用程序。从 iOS Dev Center(iOS 开发中心)请求您的第二个分发证书时,请确保您没有撤销第一个证书。

posted @ 2013-04-24 17:04 孤海傲月 阅读(1544) 评论(0)编辑

页面适应UIWebView大小,不出现横向滚动条[转]

需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果;

方法:通过js截获UIWebView中的html,然后修改html标签内容;

实例代码:

服务器端html

Java代码

  1. <html><head>
  2. <metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
  3. <metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
  4. <title>网曝四川省一考场时钟慢半小时老师称这就是命</title></head<body>网曝四川省一考场时钟慢半小时老师称这就是命</body></html>

这样显示的结果网页的最小宽度会是device-width;但有时候不需要这个宽度,就需要修改width=device-width为width=myWidth;

客户端代码

Java代码

  1. -(void)webViewDidFinishLoad:(UIWebView*)webView
  2. {
  3. //修改服务器页面的meta的值
  4. NSString*meta=[NSStringstringWithFormat:@"document.getElementsByName(\"viewport\")[0].content=\"width=%f,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\"",webView.frame.size.width];
  5. [webViewstringByEvaluatingJavaScriptFromString:meta];
  6. }

这样问题就可以解决了

新增代码:

Java代码

  1. //给网页增加utf-8编码
  2. [webViewstringByEvaluatingJavaScriptFromString:
  3. @"vartagHead=document.documentElement.firstChild;"
  4. "vartagMeta=document.createElement(\"meta\");"
  5. "tagMeta.setAttribute(\"http-equiv\",\"Content-Type\");"
  6. "tagMeta.setAttribute(\"content\",\"text/html;charset=utf-8\");"
  7. "vartagHeadAdd=tagHead.appendChild(tagMeta);"];

Java代码

  1. //给网页增加css样式
  2. [webViewstringByEvaluatingJavaScriptFromString:
  3. @"vartagHead=document.documentElement.firstChild;"
  4. "vartagStyle=document.createElement(\"style\");"
  5. "tagStyle.setAttribute(\"type\",\"text/css\");"
  6. "tagStyle.appendChild(document.createTextNode(\"BODY{padding:20pt15pt}\"));"
  7. "vartagHeadAdd=tagHead.appendChild(tagStyle);"];

Java代码

  1. //拦截网页图片并修改图片大小
  2. [webViewstringByEvaluatingJavaScriptFromString:
  3. @"varscript=document.createElement('script');"
  4. "script.type='text/javascript';"
  5. "script.text=\"functionResizeImages(){"
  6. "varmyimg,oldwidth;"
  7. "varmaxwidth=380;"//缩放系数
  8. "for(i=0;i<document.images.length;i++){"
  9. "myimg=document.images[i];"
  10. "if(myimg.width>maxwidth){"
  11. "oldwidth=myimg.width;"
  12. "myimg.width=maxwidth;"
  13. "myimg.height=myimg.height*(maxwidth/oldwidth);"
  14. "}"
  15. "}"
  16. "}\";"
  17. "document.getElementsByTagName('head')[0].appendChild(script);"];
  18. [webViewstringByEvaluatingJavaScriptFromString:@"ResizeImages();"];

其他html属性重载和此方法类似;

参考网址:

(stringByEvaluatingJavaScriptFromString的使用方法)http://www.uml.org.cn/mobiledev/201108181.asp

( iphone 获取UIWebView内Html方法)http://blog.csdn.net/diyagoanyhacker/article/details/6564897

(IOS UIWebView引用外部CSS样式)http://hi.baidu.com/jwq359699768/item/780879e5c98bfb3e4ddcaf22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值