ASIHTTPRequest 详解
2012-05-19ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度跟踪,上传文件,HTTP 认证。在新的版本中
ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能,如:异步请求,队列请求,GZIP 压缩,缓存,断点续传,进度跟踪,上传文件,HTTP 认证。在新的版本中,还加入了 Objective-C 闭包 Block 的支持,让我们的代码加轻简灵活。
下面就举例说明它的 API 用法。
发起一个同步请求
同步意为着线程阻塞,在主线程中使用此方法会使应用Hang住而不响应任何用户事件。所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替(下面会讲到)。
- (IBAction)grabURL:(id)sender {
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}
- 用 requestWithURL 快捷方法获取 ASIHTTPRequest 的一个实例
- startSynchronous 方法启动同步访问
- 由于是同步请求,没有基于事件的回调方法,所以从 request的error 属性获取错误信息
- responseString,为请求的返回 NSString 信息
创建一个异步请求
异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件。下面异步请求代码完成上面同样的一件事情:
- (IBAction)grabURLInBackground:(id)sender {
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request {
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}
- (void)requestFailed:(ASIHTTPRequest *)request {
NSError *error = [request error];
}
- 与上面不同的地方是指定了一个 “delegate”,并用 startAsynchronous 来启动网络请求
- 在这里实现了两个 delegate 的方法,当数据请求成功时会调用 requestFinished,请求失败时(如网络问题或服务器内部错误)会调用 requestFailed。
队列请求
提供了一个对异步请求更加精准丰富的控制。如:可以设置在队列中同步请求的连接数。往队列里添加的请求实例数大于 maxConcurrentOperationCount 时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才被放到队列里执行。这也适用于当我们有多个请求需求按顺序执行的时候(可能是业务上的需要,也可能是软件上的调优),仅仅需要把 maxConcurrentOperationCount 设为“1”。
- (IBAction)grabURLInTheBackground:(id)sender {
if (![self queue]) {
[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[[self queue] addOperation:request]; //queue is an NSOperationQueue
}
- (void)requestDone:(ASIHTTPRequest *)request {
NSString *response = [request responseString];
}
- (void)requestWentWrong:(ASIHTTPRequest *)request {
NSError *error = [request error];
}
创建 NSOperationQueue,这个 Cocoa 架构的执行任务(NSOperation)的任务队列。我们通过 ASIHTTPRequest.h 的源码可以看到,此类本身就是一个 NSOperation 的子类。也就是说它可以直接被放到”任务队列”中并被执行。上面的代码除了队列的创建与添加操作外,其它代码与上一例一样。
队列异步请求中中获取或识别不同request小技巧
- 可以设置一个上下文(userInfo)到 request 对象中,当请求响应完后可以通过访问 request 对象的 userInfo 获取里面的信息
- 为每一个请求实例设置不同的 setDidFinishSelector / setDidFailSelector 的回调方法
- 子类化 ASIHTTPRequest,重写 requestFinished: 与 failWithProblem: 方法
ASINetworkQueues, 它的delegate提供更为丰富的功能
提供的更多的回调方法如下:
- requestDidStartSelector,请求发起时会调此方法,你可以在此方法中跟据业务选择性的设置 request 对象的 deleaget
- requestDidReceiveResponseHeadersSelector,当接受完响应的 Header 后设计此方法,这个对下载大数据的时候相当有用,你可以在方法里做更多业务上的处理
- requestDidFinishSelector,请求并响应成功完成时调用此方法
- requestDidFailSelector,请求失败
- queueDidFinishSelector,整个队列里的所有请求都结束时调用此方法
它是 NSOperationQueues 的扩展,小而强大。但也与它的父类略有区别。如,仅添加到队列中其实并不能执行请求,只有调用[ queue g o ]才会执行;一个正在运行中的队列,并不需要重复调用[ queue go ]。默认情况下,队列中的一个请求如果失败,它会取消所有未完成的请求。可以设置[ queue setShouldCancelAllRequestsOnFailure:NO ]来修正。
取消异步请求
首先,同步请求是不能取消的。
其次,不管是队列请求,还是简单的异步请求,全部调用[ request cancel ]来取消请求。取消的请求默认都会按请求失败处理,并调用请求失败delegate。
如果不想调用delegate方法,则设置:[ request clearDelegatesAndCancel];
队列请求中需要注意的是,如果你取消了一个请求,队列会自动取消其它所有请求。如果只想取消一个请求,可以设置队列:[ queue setShouldCancelAllRequestsOnFailure:NO ]; 如果想明确取消所有请求:[ queue cancelAllOperations ];
安全的内存回收建议
request并没有retain你的delegate,所以在没有请求完的时候释放了此delegate,需要在dealloc方法里先取消所有请求,再释放请求实例,如:
- (void)dealloc {
[request clearDelegatesAndCancel];
[request release];
...
[super dealloc];
}
向服务器端上传数据
ASIFormDataRequest ,模拟 Form 表单提交,其提交格式与 Header 会自动识别。
- 没有文件:application/x-www-form-urlencoded
- 有文件:multipart/form-data
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request setPostValue:@"Ben" forKey:@"first_name"]; [request setPostValue:@"Copsey" forKey:@"last_name"]; [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"]; [request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];
如果要发送自定义数据:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]]; // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody: [request setRequestMethod:@"PUT"];
下载文件
通过设置request的setDownloadDestinationPath,可以设置下载文件用的下载目标目录。
首先,下载过程文件会保存在temporaryFileDownloadPath目录下。如果下载完成会做以下事情:
- 如果数据是压缩的,进行解压,并把文件放在 downloadDestinationPath 目录中,临时文件被删除
- 如果下载失败,临时文件被直接移到 downloadDestinationPath 目录,并替换同名文件
如果你想获取下载中的所有数据,可以实现 delegate 中的 request:didReceiveData:方法。但如果你实现了这个方法,request 在下载完后,request 并不把文件放在 downloadDestinationPath 中,需要手工处理。
获取响应信息
信息:status , header, responseEncoding
[request responseStatusCode]; [[request responseHeaders] objectForKey:@"X-Powered-By"]; [request responseEncoding];
获取请求进度
有两个回调方法可以获取请求进度:
- downloadProgressDelegate,可以获取下载进度
- uploadProgressDelegate,可以获取上传进度
cookie的支持
如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,并供下次使用。你可以用 [ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有 Cookies。当然,你也可以取消默认的Cookie策略,而使自定义的Cookie:
//Create a cookie NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease]; [properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue]; [properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName]; [properties setValue:@".allseeing-i.com" forKey:NSHTTPCookieDomain]; [properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires]; [properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath]; NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease]; //This url will return the value of the 'ASIHTTPRequestTestCookie' cookie url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"]; request = [ASIHTTPRequest requestWithURL:url]; [request setUseCookiePersistence:NO]; [request setRequestCookies:[NSMutableArray arrayWithObject:cookie]]; [request startSynchronous]; //Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie' NSLog(@"%@",[request responseString]);
大文件断点续传
0.94 以后支持大文件的断点下载,只需要设置
[ request setAllowResumeForFileDownloads:YES ]; [ request setDownloadDestinationPath:downloadPath ];
就可以了。
iOS framework 制作教程
2012-05-181.打开Xcode创建一个“Cocoa Touch Static Library”工程,并删除现有的target.
2.右键project选择添加New Target,在弹出的窗口中找到Cocoa ,在Cocoa右侧窗口中选择“Loadable Bundle”。
注意:到这步的时候不要选择framework,应为framework是MAC OS上的,iOS是不支持的,但是iOS 支持“Loadable Bundle(cfbundle)”
3.target 上右键get Info 在Build Settings下面设置下面的5项内容:
a.搜索Wrapper Extension,把默认的bundle改成framework.
b.修改Mach-O Type 为Relocatable Object File.
c.关闭Dead Code Stripping ,把勾去掉!
d.关闭Link With Standard Libraries.
e.移除所有关于“AppKit” 和 “Foundation”的参考,删除“Other Linker Flags”的所有值,并删除“GCC_PREFIX_HEADER“的值!
4.在frameworks Info.plist文件中将Bundle OS Type code的值BNDL改为:FMWK,并且在target的 get info窗口中的Properties标签栏下也将Type改为FMWK。
5.在工程中添加你的代码。
例如:我们添加一个类
#import <Foundation/Foundation.h>
@interface Help : NSObject {
}
- (void)show;
@end
#import “Help.h”
@implementation Help
- (void)show
{
NSLog(@”framework!!!”);
}
@end
6.在target上右键Add—New Build Phase—New Copy Headers Build Phase,此时target下面会多出一个灰色的文件夹—Copy Headers。
7.然后将我们刚才添加的Help类的.h文件从上面拖到下面的Copy Headers中,再在该文件夹上右键—Set Role—Public.
8.从上面将所有要打进framework的.m文件拖到target下的Compile Sources文件夹里。
9.编译,如果出错,那就在 Build下面的 将“Other Linker Flags “设置为 –ObjC 、-all_load、-lxml2,不要写在一起,请一项项添加。
注意:如果编译出现大量的错误,说明你没有删除“AppKit” 和 “Foundation”的参考,
编译后参考:

在build/Debug-iphonesimulator下面出现一个framework文件夹:

使用我们刚才制作的framework
在新的工程中导入framework

我们把刚才制作的kibernet.framework拷贝到新的工程的目录下,选择kibernet.framework文件夹
添加后的效果图

使用framework中的类:
导入头文件

ViewDid Load中测试一下:

输出结果:

From:http://www.cocoachina.com/bbs/read.php?tid-75680-page-1.html
iPhoto删除动画
2012-05-18简直太帅了!!
CGPoint fromPoint = self.imageView.frame.origin; CGPoint toPoint = CGPointMake(200, 350); UIBezierPath *movePath = [UIBezierPath bezierPath]; [movePath moveToPoint:fromPoint]; [movePath addQuadCurveToPoint:toPoint controlPoint:CGPointMake(toPoint.x,fromPoint.y)]; CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"]; moveAnim.path = movePath.CGPath; moveAnim.removedOnCompletion = YES; CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; scaleAnim.removedOnCompletion = YES; CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"]; opacityAnim.fromValue = [NSNumber numberWithFloat:1.0]; opacityAnim.toValue = [NSNumber numberWithFloat:0.1]; opacityAnim.removedOnCompletion = YES; CAAnimationGroup *animGroup = [CAAnimationGroup animation]; animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim,opacityAnim, nil]; animGroup.duration = 1; [imageView.layer addAnimation:animGroup forKey:nil];
UIBezierPath用来创建各种曲线的类。这里我们建立的二次曲线实际上就是从照片的中心点位置到垃圾箱终点的一条曲线。
接着我们建立了一个CAKeyframeAnimation的动画,这个主要用于实现动画的轨迹变化,我们将动画的path值设为之前定义的曲线值。
这样动画就会按我们设定的轨迹移动了。
接下来是大小变化的动画,设定了最初和最终的画面大小。CATransform3DMakeScale是用于生成变换矩阵的东东,对于二维的,z值始终为1.
紧接着是生成透明度的动画,很好理解。
由于我们用到了三种动画,所以需要用CAAnimationGroup,这样一次性的使用它们。
转自:http://www.cnblogs.com/scorpiozj
核心动画 CoreAnimation
2012-05-18
第一章 核心动画概念

默认动画
大多数动画属性拥有自己关联的默认动画, 你可以轻松地定制和替换。我们将会在后面“动画属性”部分列出一个完整的动画属性列表和它们相应的默认动画。
关于哪些属性执行的是什么默认动画效果请参考apple官方文档
显式动画
动画的属性也可以显式动画。要显式动画的属性,你需要创建核心动画动画类的一个实例,并指定所需的视觉效果。显式动画不会改变该 、属性的值,它只是用于动画显示。
核心动画的动画类使用基本的动画和关键帧动画把图层的内容和选取的属性动画的显示出来。所有核心动画的动画类都是从 CAAnimation 类继承而来。
CAAnimation 实现了 CAMediaTiming 协议,提供了动画的持续时间,速度,和重复计数。 CAAnimation 也实现了 CAAction 协议。该协议为图层触发一个动画动作提供了提供标准化响应。动画类同时定义了一个使用贝塞尔曲线来描述动画改变的时间函数。例如,一个 匀速时间函数(linear timing function)在动画的整个生命周期里面一直保持速度不变, 而渐缓时间函数(ease-out timing function)则在动画接近其生命周期的时候减慢速度。核心动画额外提供了一系列抽象的和细化的动画类,比如:CATransition 提供了一个图层变化的过渡效果,它能影响图层的整个内容。 动画进行的时候淡入淡出(fade)、推(push)、显露(reveal)图层的内容。这些过渡效 果可以扩展到你自己定制的 Core Image 滤镜。CAAnimationGroup 允许一系列动画效果组合在一起,并行显示动画。
animGroup.animations = [NSArray arrayWithObjects:moveAnim,scaleAnim,opacityAnim, nil];
animGroup.duration = 1;
[view.layer addAnimation:animGroup forKey:nil];

图层的坐标系在不同平台上面具有差异性。在 iOS 系统中,默认的坐标系统原点 在图层的中心左上角地方,原点向右和向下为正值。在 Mac OS X 系统中,默认的坐 标系原点在图层的中心左下角地方,原点向右和向上为正值。坐标系的所有值都是浮 点类型。你在任何平台上面创建的图层都采用该平台默认的坐标系。
3.2指定图层的几何
下图显示可以在上下文中指定图层几何的属性:


图层的 frame、bounds、position 和 anchorPoint 关系如下图所示:

在该示例中,anchorPoint 默认值为(0.5,0.5),位于图层的中心点。图层的 position 值为(100.0,100.0),bounds 为(0.0,0.0,120,80.0)。通过计算得到图层的 frame为(40.0,60.0,120.0,80.0)。

图层的 frame 值同样为(40.0,60.0,120.0,80.0),bounds 的值不变,但是图层的 position 值已经改变为(40.0,60.0)。
图层的 zPosition 属性值指定了该图层位于 Z 轴上面位置,zPosition 用于设置图层 相对于图层的同级图层的可视位置
3.3 图层的几何变换
CATransform3DIdentity 是单位矩阵,该矩阵没有缩放、旋转、歪斜、透视。把该 矩阵应用到图层上面,会把图层几何属性修改为默认值。
3.3.1 变换函数





3.4 图层的操作
图层有一个图层树,既然是树,就允许添加,插入,删除,替换相应的图层,

Core Animation 类的继承关系图


功能1 :移动图片到右下角
- (IBAction)buttonClick:(id)sender
{CGPoint fromPoint = imageView.center;//路径曲线
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
CGPoint toPoint = CGPointMake(300, 460);
[movePath addQuadCurveToPoint:toPoint
controlPoint:CGPointMake(toPoint.x,fromPoint.y)];//关键帧
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = YES;//旋转变化
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
//x,y轴缩小到0.1,Z 轴不变
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
scaleAnim.removedOnCompletion = YES;
//透明度变化
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
opacityAnim.removedOnCompletion = YES;
//关键帧,旋转,透明度组合起来执行
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim,opacityAnim, nil];
animGroup.duration = 1;
[imageView.layer addAnimation:animGroup forKey:nil];
}
功能2 :移动图片到右下角
//向右边旋转
{
CGPoint fromPoint = imageView.center;
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
CGPoint toPoint = CGPointMake(fromPoint.x +100 , fromPoint.y) ;[movePath addLineToPoint:toPoint];CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];//沿Z轴旋转
scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,0,0,1)];
//沿Y轴旋转
// scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,0,1.0,0)];
//沿X轴旋转
// scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,1.0,0,0)];
scaleAnim.cumulative = YES;
scaleAnim.duration =1;
//旋转2遍,360度
scaleAnim.repeatCount =2;
imageView.center = toPoint;
scaleAnim.removedOnCompletion = YES;
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];
animGroup.duration = 2;
[imageView.layer addAnimation:animGroup forKey:nil];
}
功能3 :图片旋转360度
- (IBAction)rota360BtnClick:(id)sender
{
CABasicAnimation *animation = [ CABasicAnimation
animationWithKeyPath: @"transform" ];
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];//围绕Z轴旋转,垂直与屏幕
animation.toValue = [ NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1.0) ];
animation.duration = 1;
//旋转效果累计,先转180度,接着再旋转180度,从而实现360旋转
animation.cumulative = YES;
animation.repeatCount = 2;//在图片边缘添加一个像素的透明区域,去图片锯齿
CGRect imageRrect = CGRectMake(0, 0,imageView.frame.size.width, imageView.frame.size.height);
UIGraphicsBeginImageContext(imageRrect.size);
[imageView.image drawInRect:CGRectMake(1,1,imageView.frame.size.width-2,imageView.frame.size.height-2)];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();[imageView.layer addAnimation:animation forKey:nil];
}
Core Animation for Mac OS X and the iPhone 下载地址
http://www.cocoachina.com/bbs/read.php?tid=12133&ordertype=asc
http://xxxxxfsadf.iteye.com/blog/565785
核心动画编程指南
Quartz 2D官方文档
项目文件下载
开源Core Animation 示例CA360
Core animation简介
2012-05-181. 简介
Core animation 是以objc语言封装的一套图形渲染,投影及动画的库的集合。
Core animation 使创建用户界面变得非常容易,通过以下方法:
1. 使用简单的编程方法实现高性能的合成
2. 使用层对象创建复杂的用户界面
3. 轻量型数据结构,能够同时使几百个层产生动画。
4. 不依赖于应用程序主线程,动画在单独的线程里运行。
5. 改进了应用程序性能。应用程序只需要重画它变化的部分(局部刷新)。
6. 灵活的布局管理模式。
2. 相关类
使用core animation,开发者不需要使用底层的API或者OpenGL就可以创建漂亮的动画界面。
core animation类分成以下几个:
1. 提供显示内容的层(layer)。
2. 动画和时间类(Animation and timing classes)。
3. 布局和约束类(Layout and constraint classes)。
4. 将多个层分成几个原子更新的执行类。
2.1 层(layrer)
层 是 core animation的基础。视图(UIView)的一个实例,有一个CALayer实例做为父层(superlayer) 以及在这层上添加的所有子层,创建的层结构称为layer tree(层之间的结构像一颗树)。在画层时,所有的层指定一个相对于父层的坐标,然后从最后一层往前画,就像画视图一样。层允许更复杂的转换,比如旋 转,倾斜,放大缩小,投影层的内容。
层还管理与其相关的动画和作用(action,这里翻译不形象,高手请指教)。从layer tree中插入或者删除层,修改层的属性以及应用程序请求都会触发动画发生。
2.2动画和时间类
隐式动画
层的许多可视属性的改变可以产生隐式的动画效果,因为这些属性都默认地与一个动画相关联。通过简单地设置可视的属性值,层会由当前值到被设置的值产生渐变的动画效果。比如,设置层的隐藏属性为真,将触发一个逐渐消失的动画效果。
显式动画
可设置动画的属性也可以产生显式的动画效果,通过创建一个动画类和指定所需要的动画效果。显式的动画并不改变层的属性。
所 有的核心动画类都由抽象类CAAnimation继承而来。CAAnimation采用CAMediaTiming协议。 CAMediaTiming规定了动画的持续时间,速度及重复次数。CAAnimation也采用了CAAction协议,该协议规定了在响应由层触发的 动作时,开始一个动画的标准方式。
核心动画还提供了其它 的动画类:
CATransition。CATransition规定了影响整个层内容的转换效果。在动画期间,它使层产生渐变(fade),推拉(push)以及揭示(reveal)的动画效果。这些常用的转换效果可以通过核心绘图过滤器进行扩展。
核心绘图过滤器相关中文链接: http://www.apple.com.cn/developer/Documentation/GraphicsImaging/Conceptual/CoreImaging/index.html
CAAnimation。CAAnimation允许大量的动画对象被分成几组,并且可以同时运行。
CAPropertyAnimation 。是CAAnimation 的子类,支持层在动画期间,为层指定一个关键路径。
CABasicAnimation。该类为层的属性提供了简单的插值。(我理解为:由于要产生动画,因此为了使在开始和结束期间产生动画,要为层属性所设置的区间值插入其它的值。)
CAKeyframeAnimation。 CAKeyframeAnimation提供关键帧动画的支持。你可以为可设置动画的层的属性指定一个关键路径,路径可以是一个数组,保存了动画每个阶段 的 值,和关键帧的动画次数及时间函数。当动画运行时,在插值时,每个值会被轮流使用。
2.3布局管理类:
CAKeyframeAnimation类用于管理所有子层的布局。每个由CAConstraint类封装的实例描述了各子层之间的几何位置关系。
2.4执行管理类
可设置动画层的属性的修改必须是执行的一部分。CATransaction负责将许多动画分成几批原子型的更新进行显示。
3. 类层次图
这章节主要描述层坐标的构成要素,构成要素之间的关系及如何转换产生复杂的效果。
1 层坐标系统
层 坐标使用了和Quanz图形一样的坐标系统。默认情况下,原点(0.0, 0.0)在左下角,向右及向上增长。请注意:该坐标系统是不同于UIView实例的坐标系统,UIView系统的原点在左上角,向右及向下增长。每个层的 实例都维护自己的坐标系统,定位所有的子层及绘图时都是相对于这个坐标系统。
2 层的几何坐标
层的几何坐标系统图:
2.1 Bounds
没有人不知道这东东,跳过。
2.2 Position
CGPoint类型,指定了相对于父层(superlayer)的位置,由父层的坐标系统来表示。
2.3 Frame
改变层的frame时,层的position和bounds会相应的改变,但层并没有frame属性,它是由层的position, bounds, anchorPoint(参照点) 和transform计算而来。
2.4 Anchor point 参照点
今天的重点属性。一定要理解。该属性是在层的bounds范围内的一个点,值为0.0到1.0。所有的转换都是相对于这个点进行计算的。
下图是三个anchor point的值:
接下来,我们来看一下frame, bounds, position 及 anchorPoint之间的关系。
如下图:
在 这个图中,anchor point的默认值为(0.5,0.5),相当于层的中心。如果你设置frame为(40.0, 60.0, 120.0, 80.0),则position值会被自动设置为(100,100)。我们还可以看到旋转和缩放的转换计算都是相对于参照点进行的。
下图的frame的大小和图3是一样的,但是anchor point为(0.0,0.0):
2.5 cornerRadius
当要绘图,剪辑子层,画边框及阴影时,可以指定层所使用的半径大小以产生圆角效果。
3 层的几何坐标转换
上面讲了那么多,都是为这一小节坐铺垫的。
CATransform3D结构体定义了一个用于旋转,缩放,偏移,倾斜及应用透视变换
的三维坐标变换。原型如下:
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
typedef struct CATransform3D CATransform3D;
可以将该结构体赋值给层的两个属性transform 或者sublayerTransform,就可以实现坐标转换。
你可以通过以下三个方法来创建和修改这个结构体:
1) 使用CATransform3D函数获取
2) 直接修改结构体数据成员
3) 使用键值编码和键路径(key paths)
3.1 转换函数
3.1.1 平移,缩放及旋转转换函数(以下如何进行坐标转换计算实在是看不懂,线性代数太滥了,真后悔当初没好好学,^&^。高手请指教):
示例:
reflectionLayer.transform = CATransform3DMakeScale(1.0, -1.0, 1.0);
该函数使层的Y坐标反转,产生倒影效果。
论谈里有一个关于CATransform3DMakeScale矩阵转换的使用例子,大家可以看一下,对于理解矩阵转换还是很有帮助的,地址:http://www.cocoachina.com/macdev/ca/2009/0611/33.html
系统也提供了反转矩阵的函数CATransform3DInvert。
3.1.3 测试是否是相等的函数:
示例:
myLayer.transform.rotation.x=0;
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@”transform.rotation.x”];
iOS开发 – 动态添加按钮
2012-05-18
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(100, 100, 100, 40)];
[button setTitle:@"弹出窗口" forState:UIControlStateNormal];
[button addTarget:self action:@selector(alertButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:test];
- (void)alertButtonClick:(id)sender {
NSLog(@"button click.");
}
iOS开源项目汇总
2012-05-18UI界面类项目:
Panoramagl —— 720全景展示
Panorama viewer library for iPhone, iPad and iPod touch
MBProgressHUD —— 进度指示
一种优雅的,半透明的进度显示效果。同时还提供了其他附加功能,比如显示完成信息并淡出。
iCarousel —— 效果很酷的分页排列
内容类似的页面需要并排列出来,供用户选择。iCarousel具有非常酷的3D效果,比如经典的CoverFlow, TimeMachine。另外还具有线性,圆柱状等其它效果。可用于图片选择,书籍选择,网页选择等。
CorePlot —— 2D图形绘图
数据可视化,可以绘制漂亮的棒状图、饼状图、线状图等等。
kal —— iPhone日历控件
一个类似于ios系统默认日历开源日历库,支持添加事件,自定义日历样式等功能。
EGOTableViewPullRefresh —— 下拉列表刷新
使用这个库,很容易就可以实现下拉刷新效果。微博,RSS阅读器之类的软件经常使用。
CMPopTipView —— 泡泡风格的提示界面
一个泡泡风格的提示框开源控件, 继承自UIView。iPad,iPhone通用。
HMGLTransitions —— 视图切换动画
提供一些UIView或UIViewController切换时候的3D动画效果。比如翻转,开门,撕纸等。
QuickDialog —— 表格风格的配置界面
在iphone, 通常使用UITableView来创建一些配置,登录界面,创建这些界面通常很机械很烦人。QuickDialog可以快速地在表格项中放置开关On/Off控件、日期控件、Sliders、单选按钮编辑框等等。这样就不用使用低级的UITableView。
JMTabView —— 自定义标签栏和Tabbar
JMTabView是一个iOS自定义的标签栏开源控件,界面效果完全使用Core Graphics绘制,而没有用图片,所以内容很容易改为你需要的。
SBTableAlert —— 带表格视图的消息对话框
SBTableAlert对话框中提供了一种方式,在UIAlertView视图中包含了UITableView的效果,从而可以实现在UIAlertView中进行表格多选。使用简单。
EasyTableView —— 可水平或垂直滚动的TableView
原始的UITableView只可以垂直滚动。EasyTableView可以很方便的实现TableView的水平滚动, 并可重复实现用户自定义的View,就类似重复使用UITableViewCell, 这对于提高效率很有帮助。
MTStatusBarOverlay —— 在状态栏上显示自定义的View
iOS程序通常会在最上面出现一个状态栏。使用这个库,可以很方便的在状态栏上显示一些信息,比如下载进度等。
iOS-MagnifyingGlass ——IOS放大镜效果
可以选择放大镜的样式,和放大倍数
非UI界面类:
RegexKitLite —— 正则表达式
要在字符串中抽取某些特定内容,或者检查输入合法性,很多时候需要用到正则表达式。RegexKitLite对NSString做了扩展, 支持正则表达的查找,替换等。
Openear—— 语音识别和TTS
提供了语音识别和Text-to-speach 的接口
ASIHttpRequest —— HTTP Network库
ASIHttpRequest库极大的简化了网络通 信,提供更先进的工具,例如文件上传工具,重定向处理工具、验证工具、等等。
KissXml —— xml解析库
很方便的一个xml解析器,支持Xpath查询。
FMDatabase —— SQLite的Objective-C封装
SQLite的C API对初学者来说实在太麻烦太琐碎,难度太高。 FMDB说穿了其实只是把C API包装成简单易用的Objective-C类。对于SQLite初学者来说,大大减低了上手的难度。有了FMDB,写程式时只要专心在SQLite的语法上,而不用去理那堆有看没有懂的C API,实在是件快乐的事情。
jsonframework —— JSON支持
它是一个开源框架,基于BSD协议发布。由于json-framework是开放源代码的,当你需要使用它时你只需将json的源代码加入到你的工程中。
SDWebImage —— 简化网络图片处理
用SDWebImage调用网站上的图片,跟本地调用内置在应用包里的图片一样简单。操作也很简单。
Google Toolbox for Mac(GTM)—— 从不同Google项目收集的代码
包含各种的工具类。比如字符串的base64及二进制编码解码, 系统版本号比较, 路径查找等等。每个工具类都比较独立, 可单独抽出来使用。
SFHFKeychainUtils(scifihifi-iphone)—— 保存用户密码到keychain中
为了用户安全,可以使用钥匙串Keychain来保存用户密码。SFHFKeychainUtils封装了钥匙串的访问, 读写,使用起来很方便。
MKStoreKit —— 程序内购买
程序内购买的流程的封装。
GLGestureRecognizer ——手势识别器
封装了多种手势的识别器,例如三角形,长方形,圆形,五角星形等
网络编程 – 检查网络
2012-05-18Reachability是Apple提供的示例代码,在xcode的developer document中能找到。将Reachability.h 和 Reachability.m添加到工程,将SystemConfiguration.framework 添加进工程。
Reachability.h 定义了三种网络状态:
typedef enum {
NotReachable = 0, //无连接
ReachableViaWiFi, //使用3G/GPRS网络
ReachableViaWWAN //使用WiFi网络
} NetworkStatus;
因此可以这样检查网络状态
Reachability *reachability = [Reachability reachabilityWithHostName:@“www.apple.com”];
switch ([reachability currentReachabilityStatus]) {
case NotReachable: //没有网络连接
break;
case ReachableViaWWAN: //使用3G网络
break;
case ReachableViaWiFi: //使用WiFi网络
break;
}
检查网络环境
//是否启用WIFI
+ (BOOL) isWifiEnable {
return [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable;
}
//是否启用3G
+ (BOOL) is3GEnable {
return [[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable;
}
- (void)viewWillAppear:(BOOL)animated {
if (self.isWifiEnable() && self.is3GEnable()) {
NSLog(@"有网络链接");
} else {
NSLog(@"木有网络链接");
}
}
iPhone开发入门 — Objective-C 基础(2)
2012-05-17interface
@interface Shape : NSObject {
@private
NSString *color;
CGPoint *position;
}
-(void)setColor:(NSString *)aColor;
-(void)drawShape;
@end
class
@implementation Shape
-(void)setColor:(NSString *)aColor {
color = aColor;
}
-(void)drawShape {
NSLog(@"Drawing a shape...");
}
@end
protocol
delegate
datasource
iPhone开发入门 — Objective-C 基础(1)
2012-05-16Hello World
int main(int argc, char*argv[]) {
NSLog(@"Hello World!");
return 0;
}
基本数据类型
int, float, double, char
id
id数据类型可以存储任何类型的对象。类似其他面向对象语言里的基类Object。id数据类型在Objective-C里是个非常重要的特性,它是多态和动态绑定的基础。
SEL
SEL类型是Objective-C用来定义方法的关键字,虽然是方法定义,但是不从属于任何类实例,其值通过@selector进行计算,可以简单理解为一个函数指针,实际类型定义是const char*。
BOOL
boolean类型,其值可以是YES和NO,TRUE和FALSE。
nil,NULL,NSNull
nil用来给对象赋值
NULL可以给任何指针赋值
NSNull用于集合操作
虽然都是标示空值,但是应用场合不同,在合适的场合正确赋值可以减少不必要的错误。
定义常量
#define FLAG_OK 1;
#define ERROR_MSG_FAIL = @”FAIL.”;
常用运算符
| 运算符 | 含义 |
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
| % | 取模 |
| = | 赋值 |
| ++ | 自增 |
| – | 自减 |
| == | 等于 |
| != | 不等于 |
| < | 小于 |
| > | 大于 |
| >= | 大于等于 |
| <= | 小于等于 |
| || | OR |
| && | AND |
结构
if(n<100) {
...
}
if(n<100) {
...
} else {
...
}
for(int n = 1; n<100; n++) {
...
}
for(id i in objs) {
...
}
while(i < 100) {
...
i--;
}
switch{
case 1:
...
break;
default:
...
}








