<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CBC-Blog</title>
	<atom:link href="http://www.chenbaocheng.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chenbaocheng.com</link>
	<description></description>
	<lastBuildDate>Fri, 18 May 2012 16:40:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ASIHTTPRequest 详解</title>
		<link>http://www.chenbaocheng.com/asihttprequest-%e8%af%a6%e8%a7%a3/</link>
		<comments>http://www.chenbaocheng.com/asihttprequest-%e8%af%a6%e8%a7%a3/#comments</comments>
		<pubDate>Fri, 18 May 2012 16:32:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=125</guid>
		<description><![CDATA[ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能，如：异步请求，队列请求，GZIP 压缩，缓存，断点续传，进度跟踪，上传文件，HTTP 认证。在新的版本中 ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能，如：异步请求，队列请求，GZIP 压缩，缓存，断点续传，进度跟踪，上传文件，HTTP 认证。在新的版本中，还加入了 Objective-C 闭包 Block 的支持，让我们的代码加轻简灵活。 下面就举例说明它的 API 用法。 发起一个同步请求 同步意为着线程阻塞，在主线程中使用此方法会使应用Hang住而不响应任何用户事件。所以，在应用程序设计时，大多被用在专门的子线程增加用户体验，或用异步请求代替（下面会讲到）。 - (IBAction)grabURL:(id)sender { NSURL *url = [NSURL URLWithString:@&#34;http://allseeing-i.com&#34;]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; } } [...]]]></description>
			<content:encoded><![CDATA[<p>ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能，如：异步请求，队列请求，GZIP 压缩，缓存，断点续传，进度跟踪，上传文件，HTTP 认证。在新的版本中</p>
<p>ASIHTTPRequest 是一款极其强劲的 HTTP 访问开源项目。让简单的 API 完成复杂的功能，如：异步请求，队列请求，GZIP 压缩，缓存，断点续传，进度跟踪，上传文件，HTTP 认证。在新的版本中，还加入了 Objective-C 闭包 Block 的支持，让我们的代码加轻简灵活。</p>
<p>下面就举例说明它的 API 用法。</p>
<p><strong>发起一个同步请求</strong></p>
<p>同步意为着线程阻塞，在主线程中使用此方法会使应用Hang住而不响应任何用户事件。所以，在应用程序设计时，大多被用在专门的子线程增加用户体验，或用异步请求代替（下面会讲到）。</p>
<pre class="wp-code-highlight prettyprint">
- (IBAction)grabURL:(id)sender {
	NSURL *url = [NSURL URLWithString:@&quot;http://allseeing-i.com&quot;];
	ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
	[request startSynchronous];
	NSError *error = [request error];
	if (!error) {
		NSString *response = [request responseString];
	}
}
</pre>
<ul>
<li>用 requestWithURL 快捷方法获取 ASIHTTPRequest 的一个实例</li>
<li>startSynchronous 方法启动同步访问</li>
<li>由于是同步请求，没有基于事件的回调方法，所以从 request的error 属性获取错误信息</li>
<li>responseString，为请求的返回 NSString 信息</li>
</ul>
<p><strong>创建一个异步请求</strong><br />
异步请求的好处是不阻塞当前线程，但相对于同步请求略为复杂，至少要添加两个回调方法来获取异步事件。下面异步请求代码完成上面同样的一件事情：</p>
<pre class="wp-code-highlight prettyprint">
- (IBAction)grabURLInBackground:(id)sender {
	NSURL *url = [NSURL URLWithString:@&quot;http://allseeing-i.com&quot;];
	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];
}
</pre>
<ul>
<li>与上面不同的地方是指定了一个 &#8220;delegate&#8221;，并用 startAsynchronous 来启动网络请求</li>
<li>在这里实现了两个 delegate 的方法，当数据请求成功时会调用 requestFinished，请求失败时（如网络问题或服务器内部错误）会调用 requestFailed。</li>
</ul>
<p><strong>队列请求</strong><br />
提供了一个对异步请求更加精准丰富的控制。如：可以设置在队列中同步请求的连接数。往队列里添加的请求实例数大于 maxConcurrentOperationCount 时，请求实例将被置为等待，直到前面至少有一个请求完成并出列才被放到队列里执行。这也适用于当我们有多个请求需求按顺序执行的时候（可能是业务上的需要，也可能是软件上的调优），仅仅需要把 maxConcurrentOperationCount 设为“1”。</p>
<pre class="wp-code-highlight prettyprint">
- (IBAction)grabURLInTheBackground:(id)sender {
	if (![self queue]) {
		[self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
	}

	NSURL *url = [NSURL URLWithString:@&quot;http://allseeing-i.com&quot;];
	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];
}
</pre>
<p>创建 NSOperationQueue，这个 Cocoa 架构的执行任务（NSOperation）的任务队列。我们通过 ASIHTTPRequest.h 的源码可以看到，此类本身就是一个 NSOperation 的子类。也就是说它可以直接被放到&#8221;任务队列&#8221;中并被执行。上面的代码除了队列的创建与添加操作外，其它代码与上一例一样。</p>
<p><strong>队列异步请求中中获取或识别不同request小技巧</strong></p>
<ul>
<li>可以设置一个上下文（userInfo）到 request 对象中，当请求响应完后可以通过访问 request 对象的 userInfo 获取里面的信息</li>
<li>为每一个请求实例设置不同的 setDidFinishSelector / setDidFailSelector 的回调方法</li>
<li>子类化 ASIHTTPRequest，重写 requestFinished: 与 failWithProblem: 方法</li>
</ul>
<p>ASINetworkQueues, 它的delegate提供更为丰富的功能</p>
<p>提供的更多的回调方法如下：</p>
<ul>
<li> requestDidStartSelector，请求发起时会调此方法，你可以在此方法中跟据业务选择性的设置 request 对象的 deleaget</li>
<li>requestDidReceiveResponseHeadersSelector，当接受完响应的 Header 后设计此方法，这个对下载大数据的时候相当有用，你可以在方法里做更多业务上的处理</li>
<li>requestDidFinishSelector，请求并响应成功完成时调用此方法</li>
<li>requestDidFailSelector，请求失败</li>
<li>queueDidFinishSelector，整个队列里的所有请求都结束时调用此方法</li>
</ul>
<p>它是 NSOperationQueues 的扩展，小而强大。但也与它的父类略有区别。如，仅添加到队列中其实并不能执行请求，只有调用[  queue g o ]才会执行；一个正在运行中的队列，并不需要重复调用[  queue go  ]。默认情况下，队列中的一个请求如果失败，它会取消所有未完成的请求。可以设置[  queue setShouldCancelAllRequestsOnFailure:NO  ]来修正。</p>
<p><strong>取消异步请求</strong></p>
<p>首先，同步请求是不能取消的。</p>
<p>其次，不管是队列请求，还是简单的异步请求，全部调用[ request cancel ]来取消请求。取消的请求默认都会按请求失败处理，并调用请求失败delegate。<br />
如果不想调用delegate方法，则设置：[ request clearDelegatesAndCancel];</p>
<p>队列请求中需要注意的是，如果你取消了一个请求，队列会自动取消其它所有请求。如果只想取消一个请求，可以设置队列：[ queue setShouldCancelAllRequestsOnFailure:NO ]; 如果想明确取消所有请求：[ queue cancelAllOperations ];</p>
<p><strong>安全的内存回收建议</strong></p>
<p>request并没有retain你的delegate，所以在没有请求完的时候释放了此delegate，需要在dealloc方法里先取消所有请求，再释放请求实例，如：</p>
<pre class="wp-code-highlight prettyprint">
- (void)dealloc {
	[request clearDelegatesAndCancel];
	[request release];
	...
	[super dealloc];
}
</pre>
<p><strong>向服务器端上传数据</strong></p>
<p>ASIFormDataRequest ，模拟 Form 表单提交，其提交格式与 Header 会自动识别。</p>
<ul>
<li>没有文件：application/x-www-form-urlencoded</li>
<li>有文件：multipart/form-data</li>
</ul>
<pre class="wp-code-highlight prettyprint">
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@&quot;Ben&quot; forKey:@&quot;first_name&quot;];
[request setPostValue:@&quot;Copsey&quot; forKey:@&quot;last_name&quot;];
[request setFile:@&quot;/Users/ben/Desktop/ben.jpg&quot; forKey:@&quot;photo&quot;];
[request addData:imageData withFileName:@&quot;george.jpg&quot; andContentType:@&quot;image/jpeg&quot; forKey:@&quot;photos&quot;];
</pre>
<p>如果要发送自定义数据：</p>
<pre class="wp-code-highlight prettyprint">
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request appendPostData:[@&quot;This is my data&quot; dataUsingEncoding:NSUTF8StringEncoding]];
// Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
[request setRequestMethod:@&quot;PUT&quot;];
</pre>
<p><strong>下载文件</strong></p>
<p>通过设置request的setDownloadDestinationPath，可以设置下载文件用的下载目标目录。</p>
<p>首先，下载过程文件会保存在temporaryFileDownloadPath目录下。如果下载完成会做以下事情：</p>
<ul>
<li>如果数据是压缩的，进行解压，并把文件放在 downloadDestinationPath 目录中，临时文件被删除</li>
<li>如果下载失败，临时文件被直接移到 downloadDestinationPath 目录，并替换同名文件</li>
</ul>
<p>如果你想获取下载中的所有数据，可以实现 delegate 中的 request:didReceiveData:方法。但如果你实现了这个方法，request 在下载完后，request 并不把文件放在 downloadDestinationPath 中，需要手工处理。</p>
<p><strong>获取响应信息</strong></p>
<p>信息：status , header, responseEncoding</p>
<pre class="wp-code-highlight prettyprint">
[request responseStatusCode];
[[request responseHeaders] objectForKey:@&quot;X-Powered-By&quot;];
[request responseEncoding];
</pre>
<p><strong>获取请求进度</strong></p>
<p>有两个回调方法可以获取请求进度：</p>
<ul>
<li>downloadProgressDelegate，可以获取下载进度</li>
<li>uploadProgressDelegate，可以获取上传进度</li>
</ul>
<p><strong>cookie的支持</strong></p>
<p>如果 Cookie 存在的话，会把这些信息放在 NSHTTPCookieStorage 容器中共享，并供下次使用。你可以用 [ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有 Cookies。当然，你也可以取消默认的Cookie策略，而使自定义的Cookie：</p>
<pre class="wp-code-highlight prettyprint">
//Create a cookie
NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
[properties setValue:[@&quot;Test Value&quot; encodedCookieValue] forKey:NSHTTPCookieValue];
[properties setValue:@&quot;ASIHTTPRequestTestCookie&quot; forKey:NSHTTPCookieName];
[properties setValue:@&quot;.allseeing-i.com&quot; forKey:NSHTTPCookieDomain];
[properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
[properties setValue:@&quot;/asi-http-request/tests&quot; forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease];

//This url will return the value of the 'ASIHTTPRequestTestCookie' cookie
url = [NSURL URLWithString:@&quot;http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie&quot;];
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(@&quot;%@&quot;,[request responseString]);
</pre>
<p><strong>大文件断点续传</strong></p>
<p>0.94 以后支持大文件的断点下载，只需要设置</p>
<pre class="wp-code-highlight prettyprint">
[ request setAllowResumeForFileDownloads:YES ];
[ request setDownloadDestinationPath:downloadPath ];
</pre>
<p>就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/asihttprequest-%e8%af%a6%e8%a7%a3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS framework 制作教程</title>
		<link>http://www.chenbaocheng.com/ios-framework-%e5%88%b6%e4%bd%9c%e6%95%99%e7%a8%8b/</link>
		<comments>http://www.chenbaocheng.com/ios-framework-%e5%88%b6%e4%bd%9c%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Fri, 18 May 2012 15:52:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=120</guid>
		<description><![CDATA[1.打开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 &#60;Foundation/Foundation.h&#62; @interface Help : NSObject { } - (void)show; @end #import &#8220;Help.h&#8221; @implementation Help [...]]]></description>
			<content:encoded><![CDATA[<p>1.打开Xcode创建一个“Cocoa Touch Static Library”工程，并删除现有的target.</p>
<p>2.右键project选择添加New Target，在弹出的窗口中找到Cocoa ,在Cocoa右侧窗口中选择“Loadable Bundle”。<br />
注意：到这步的时候不要选择framework,应为framework是MAC OS上的，iOS是不支持的，但是iOS 支持“Loadable Bundle(cfbundle)”</p>
<p>3.target 上右键get Info 在Build  Settings下面设置下面的5项内容：<br />
a.搜索Wrapper Extension,把默认的bundle改成framework.<br />
b.修改Mach-O Type 为Relocatable Object File.<br />
c.关闭Dead Code Stripping ,把勾去掉！<br />
d.关闭Link With Standard Libraries.<br />
e.移除所有关于“AppKit”  和  “Foundation”的参考，删除“Other Linker Flags”的所有值，并删除“GCC_PREFIX_HEADER“的值！</p>
<p>4.在frameworks Info.plist文件中将Bundle OS Type code的值BNDL改为：FMWK，并且在target的 get info窗口中的Properties标签栏下也将Type改为FMWK。</p>
<p>5.在工程中添加你的代码。<br />
例如：我们添加一个类<br />
#import &lt;Foundation/Foundation.h&gt;</p>
<p>@interface Help : NSObject {</p>
<p>}</p>
<p>- (void)show;</p>
<p>@end</p>
<p>#import &#8220;Help.h&#8221;</p>
<p>@implementation Help</p>
<p>- (void)show<br />
{<br />
NSLog(@&#8221;framework！！！&#8221;);<br />
}</p>
<p>@end</p>
<p>6.在target上右键Add&#8212;New Build Phase&#8212;New Copy Headers Build Phase,此时target下面会多出一个灰色的文件夹—Copy Headers。</p>
<p>7.然后将我们刚才添加的Help类的.h文件从上面拖到下面的Copy Headers中，再在该文件夹上右键—Set Role&#8212;Public.</p>
<p>8.从上面将所有要打进framework的.m文件拖到target下的Compile Sources文件夹里。</p>
<p>9.编译,如果出错，那就在  Build下面的 将“Other Linker Flags “设置为 –ObjC 、-all_load、-lxml2,不要写在一起，请一项项添加。</p>
<p>注意：如果编译出现大量的错误，说明你没有删除“AppKit”  和  “Foundation”的参考，</p>
<p>编译后参考：<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_b76795b34f0f18c.png" alt="" border="0" /></p>
<p>在build/Debug-iphonesimulator下面出现一个framework文件夹：<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_9c4aac869d2fda6.png" alt="" border="0" /></p>
<p><span style="font-size: medium;">使用我们刚才制作的framework</span></p>
<p>在新的工程中导入framework<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_fbcf44744201600.png" alt="" border="0" /><br />
我们把刚才制作的kibernet.framework拷贝到新的工程的目录下，选择kibernet.framework文件夹</p>
<p>添加后的效果图<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_347f7d35424bdb8.png" alt="" border="0" /></p>
<p>使用framework中的类：<br />
导入头文件<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_9d1f678b4581136.png" alt="" border="0" /></p>
<p>ViewDid Load中测试一下：<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_2c1b860dfd263cc.png" alt="" border="0" /><br />
输出结果：<br />
<strong></strong><br />
<img src="http://cc.cocimg.com/bbs/attachment/Fid_21/21_53328_c26cee64049bf72.png" alt="" border="0" /></p>
<p>&nbsp;</p>
<p>From:http://www.cocoachina.com/bbs/read.php?tid-75680-page-1.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/ios-framework-%e5%88%b6%e4%bd%9c%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoto删除动画</title>
		<link>http://www.chenbaocheng.com/iphoto%e5%88%a0%e9%99%a4%e5%8a%a8%e7%94%bb/</link>
		<comments>http://www.chenbaocheng.com/iphoto%e5%88%a0%e9%99%a4%e5%8a%a8%e7%94%bb/#comments</comments>
		<pubDate>Fri, 18 May 2012 15:48:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=118</guid>
		<description><![CDATA[简直太帅了！！ 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:@&#34;position&#34;]; moveAnim.path = movePath.CGPath; moveAnim.removedOnCompletion = YES; CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@&#34;transform&#34;]; scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; scaleAnim.removedOnCompletion = YES; CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@&#34;alpha&#34;]; opacityAnim.fromValue [...]]]></description>
			<content:encoded><![CDATA[<p>简直太帅了！！</p>
<pre class="wp-code-highlight prettyprint">
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:@&quot;position&quot;];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = YES;

CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@&quot;transform&quot;];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
scaleAnim.removedOnCompletion = YES;

CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@&quot;alpha&quot;];
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];
</pre>
<p>UIBezierPath用来创建各种曲线的类。这里我们建立的二次曲线实际上就是从照片的中心点位置到垃圾箱终点的一条曲线。<br />
接着我们建立了一个CAKeyframeAnimation的动画，这个主要用于实现动画的轨迹变化，我们将动画的path值设为之前定义的曲线值。<br />
这样动画就会按我们设定的轨迹移动了。<br />
接下来是大小变化的动画，设定了最初和最终的画面大小。CATransform3DMakeScale是用于生成变换矩阵的东东，对于二维的，z值始终为1.<br />
紧接着是生成透明度的动画，很好理解。<br />
由于我们用到了三种动画，所以需要用CAAnimationGroup，这样一次性的使用它们。</p>
<p>转自:http://www.cnblogs.com/scorpiozj</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/iphoto%e5%88%a0%e9%99%a4%e5%8a%a8%e7%94%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>核心动画 CoreAnimation</title>
		<link>http://www.chenbaocheng.com/112/</link>
		<comments>http://www.chenbaocheng.com/112/#comments</comments>
		<pubDate>Fri, 18 May 2012 15:24:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=112</guid>
		<description><![CDATA[核心动画 CoreAnimation &#160;  第一章 核心动画概念 核心动画,开发人员可以为他们的应用创建动态用户界面,而无需使用低级别的图形 API,如 OpenGL 来获取高效的动画性能。 前言，核心动画的好处 1.简单易用的高性能混合编程模型。 2.类似视图一样,你可以通过使用图层来创建复杂的接口。    通过是CALayer来使用更复杂的一些动画。 3.轻量级的数据结构,它可以同时显示并让上百个图层产生动画效果。      控制多个CALayer来显示动画效果    4.一套简单的动画接口,可以让你的动画运行在独立的线程里面,并可以 独立于主线程之外。 5.一旦动画配置完成并启动,核心动画完全控制并独立完成相应的动画帧。 6.提高应用性能。应用程序只当发生改变的时候才重绘内容。再小的应用程序也需要改变和提供布局服务层。核心动画还消除了在动画的帧速率 上运行的应用程序代码。 7.灵活的布局管理模型。包括允许图层相对同级图层的关系来设置相应属性的位置和大小。    可以使用CALayer来更灵活的进行布局。  1.1 Core animation类 1.提供显示内容的图层类。CALayer 2.动画和计时类。Animation and Timing Classes 3.布局和约束类。 4.事务类,在原子更新的时候组合图层类。 核心动画的基础类包含在 Quartz 核心框架(Quartz Core framework)里面,虽然它的其他图层类在其他框架里面定义。下图显示了核心动画的类层次结构。 1.1.1 图层类     层类（Layer Classes）    Layer Classes是core animation的基础。Layer Classes提供了一个抽象的概念，这个概念对于那些使用NSview和UIview的开发者来说是很熟悉的。基础层是由CAlayer类提供的，CAlayer是所有Core Animation层的父类。   [...]]]></description>
			<content:encoded><![CDATA[<div><strong>核心动画 CoreAnimation</strong></div>
<p>&nbsp;</p>
<p><strong> 第一章 核心动画概念</strong></p>
<div>核心动画,开发人员可以为他们的应用创建动态用户界面,而无需使用低级别的图形 API,如 OpenGL 来获取高效的动画性能。</div>
<div></div>
<div><strong>前言，核心动画的好处</strong></div>
<div></div>
<div>1.简单易用的高性能混合编程模型。</div>
<div></div>
<div>2.类似视图一样,你可以通过使用图层来创建复杂的接口。</div>
<div>   通过是CALayer来使用更复杂的一些动画。</div>
<div></div>
<div>3.轻量级的数据结构,它可以同时显示并让上百个图层产生动画效果。</div>
<div>     控制多个CALayer来显示动画效果</div>
<div></div>
<div>   4.一套简单的动画接口,可以让你的动画运行在独立的线程里面,并可以</div>
<div>独立于主线程之外。</div>
<div>5.一旦动画配置完成并启动,核心动画完全控制并独立完成相应的动画帧。</div>
<div>6.提高应用性能。应用程序只当发生改变的时候才重绘内容。再小的应用程序也需要改变和提供布局服务层。核心动画还消除了在动画的帧速率</div>
<div>上运行的应用程序代码。</div>
<div>7.灵活的布局管理模型。包括允许图层相对同级图层的关系来设置相应属性的位置和大小。</div>
<div>   可以使用CALayer来更灵活的进行布局。</div>
<div></div>
<div><strong> 1.1 Core animation类</strong></div>
<div>1.提供显示内容的图层类。CALayer</div>
<div>2.动画和计时类。Animation and Timing Classes</div>
<div>3.布局和约束类。</div>
<div>4.事务类,在原子更新的时候组合图层类。</div>
<div>核心动画的基础类包含在 Quartz 核心框架(Quartz Core framework)里面,虽然它的其他图层类在其他框架里面定义。下图显示了核心动画的类层次结构。</div>
<div>
<div><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200211.png" alt="" width="738" height="526" align="center" /></div>
</div>
<div></div>
<div><strong>1.1.1 图层类</strong></div>
<div><strong>    层类（Layer Classes）</strong></div>
<div>   Layer Classes是core animation的基础。Layer Classes提供了一个抽象的概念，这个概念对于那些使用NSview和UIview的开发者来说是很熟悉的。基础层是由CAlayer类提供的，CAlayer是所有Core Animation层的父类。</div>
<div>    同一个视图类的实例一样，一个CAlayer实例也有一个单独的superlayer和上面所有的子层（sublayers），它创建了一个有层次结构的层，我们称之为layer tree。layers的绘制就像views一样是从后向前绘制的，绘制的时候我们要指定其相对与他们的superlayer的集合形状，同时还需要创建一个局部的坐标系。layers可以做一些更复杂的操作，例如rotate(旋转)，skew(倾斜)，scale(放缩)，和project the layer content(层的投影)。</div>
<div>    图层的内容提供</div>
<div>(1)直接设置层的content属性到一个core graphics图，或者通过delegation来设置</div>
<div>(2)提供一个代理直接绘制到Core Graphics image context（核心图形的上下文）</div>
<div>(3)设置任意数量的所有层共有的可视的风格属性。例如：backgroundColor(背景色)，opacity(透明度)和masking(遮罩)。max os x应用通过使用core image filters来达到这种可视化的属性。</div>
<div>(4)子类化CAlayer，同时在更多的封装方式中完成上面的任意技术。</div>
<p>&nbsp;</p>
<div><strong>  三个重要的子类</strong></div>
<div>(1)CAScrollLayer:它是CALayer的一个子类，用来显示layer的某一部分，一个CAScrollLayer对象的滚动区域是由其子层的布局来定义的。CAScrollLayer没有提供键盘或者鼠标事件，也没有提供明显的滚动条。</div>
<div>(2)CATextLayer：它是一个很方便就可以从string和attributed string创建layer的content的类。</div>
<div>(3)CATiledLayer：它允许在增量阶段显示大和复杂的图像（就是将图形进行分块显示，来减少</div>
<p>&nbsp;</p>
<div><strong>   Mac OS X 额外的类</strong></div>
<div>CAOpenGLLayer 提供了一个OpenGL渲染环境。你必须继承这个类来使用 OpenGL 提供的内容。内容可以是静态的,或可随着时间的推移更新。</div>
<div>QCCompositionLayer(由Quartz框架提供)可以把Quartz合成的内容动画 显示。</div>
<div>QTMovieLayer and QTCaptureLayer (QTKit 框架提供)提供播放 QuickTime 影片和视频直播。</div>
<p>&nbsp;</p>
<div><strong>   iOS 独特的CALayer</strong></div>
<div>CAEAGLLayer 提供了一个OpenGLES渲染环境。</div>
<div>CALayer 的类引入键-值编码兼容的容器类概念,也就是说一个类可以使用键 &#8211; 值编码的方法存储任意值,而无需创建一个子类。CALayer 的还扩展了 NSKeyValueCoding 的非正式协议,加入默认键值和额外的结构类型的自动对象包装 (CGPoint,CGSize,CGRect,CGAffineTransform 和 CATransform3D)的支持,并 提供许多这些结构的关键路径领域的访问。</div>
<div>CALayer也管理动画和与其相关的layer的actions。layers接收一些从layer tree中触发的insert和remove消息，修改被创建的layer的属性，或者指明开发者的需求。这些actions通常都会导致动画的产生。</div>
<p>&nbsp;</p>
<div></div>
<div><strong>1.1.2 动画和计时类（Animation and Timing Classes）</strong></div>
<div></div>
<div>     图层的很多可视化属性是可以隐式动画的。通过简单的改变图层的可动画显示的属性,可以让图层现有属性从当前值动画渐变到新的属性值。例如设置图层的 hidden 属性为 YES 将会触发动画使层逐渐淡出。</div>
<p><strong>默认动画 </strong></p>
<p>大多数动画属性拥有自己关联的默认动画, 你可以轻松地定制和替换。我们将会在后面“动画属性”部分列出一个完整的动画属性列表和它们相应的默认动画。</p>
<p>关于哪些属性执行的是什么默认动画效果请参考apple<strong>官方文档</strong></p>
<p><strong>   显式动画</strong></p>
<p>动画的属性也可以显式动画。要显式动画的属性,你需要创建核心动画动画类的一个实例,并指定所需的视觉效果。显式动画不会改变该 、属性的值,它只是用于动画显示。</p>
<div></div>
<p>核心动画的动画类使用基本的动画和关键帧动画把图层的内容和选取的属性动画的显示出来。所有核心动画的动画类都是从 CAAnimation 类继承而来。</p>
<p>CAAnimation 实现了 CAMediaTiming 协议,提供了动画的持续时间,速度,和重复计数。 CAAnimation 也实现了 CAAction 协议。该协议为图层触发一个动画动作提供了提供标准化响应。动画类同时定义了一个使用贝塞尔曲线来描述动画改变的时间函数。例如,一个 匀速时间函数(linear timing function)在动画的整个生命周期里面一直保持速度不变, 而渐缓时间函数(ease-out timing function)则在动画接近其生命周期的时候减慢速度。核心动画额外提供了一系列抽象的和细化的动画类,比如:CATransition 提供了一个图层变化的过渡效果,它能影响图层的整个内容。 动画进行的时候淡入淡出(fade)、推(push)、显露(reveal)图层的内容。这些过渡效 果可以扩展到你自己定制的 Core Image 滤镜。CAAnimationGroup 允许一系列动画效果组合在一起,并行显示动画。</p>
<p>&nbsp;</p>
<div>多个动画效果叠加，比如在执行动画的过程中需要同时修改position,alpha, frame等属性，可以将三个动画合成一起执行。</div>
<div>
<div>
<div>CAAnimationGroup *animGroup = [CAAnimationGroup animation];</div>
<p>animGroup.animations = [NSArray arrayWithObjects:moveAnim,scaleAnim,opacityAnim, nil];<br />
animGroup.duration = 1;<br />
[view.layer addAnimation:animGroup forKey:nil];</p>
</div>
</div>
<div></div>
<div><strong>CAPropertyAnimation 是一个抽象的子类,它支持动画的显示图层的关键路 径中指定的属性</strong></div>
<div>一般不直接使用,而是使用它的子类，CABasicAnimation,CAKeyframeAnimation. 在它的子类里修改属性来运行动画。</div>
<p>&nbsp;</p>
<div><strong>CABasicAnimation 简单的为图层的属性提供修改。</strong></div>
<div> 很多图层的属性修改默认会执行这个动画类。比如大小，透明度，颜色等属性</div>
<div></div>
<div><strong>CAKeyframeAnimation 支持关键帧动画,你可以指定的图层属性的关键路径</strong></div>
<div>动画,包括动画的每个阶段的价值,以及关键帧时间和计时功能的一系列值。在 动画运行是,每个值被特定的插入值替代。</div>
<div>核心动画 和 Cocoa Animation 同时使用这些动画类。使用动画描述,是因为这些类涉及到核心动画,这些将会在Animation Types and Timing Programming Guide 有较深入的讨论。</div>
<p>&nbsp;</p>
<div></div>
<div><strong>1.1.3 布局管理器类</strong></div>
<div>Application Kit 的视图类相对于 superlayer 提供了经典的“struts and springs”定位 模型。图层类兼容这个模型,同时 Mac OS X 上面的核心动画提供了一套更加灵活 的布局管理机制,它允许开发者自己修改布局管理器。核心动画的 CAConstraint 类 是一个布局管理器,它可以指定子图层类限制于你指定的约束集合。每个约束 (CAConstraint 类的实例封装)描述层的几何属性(左,右,顶部或底部的边缘或水 平或垂直中心)的关系,关系到其同级之一的几何属性层或 superlayer。</div>
<div>通用的布局管理器和约束性布局管理器将会在“布局核心动画的图层”部分讨论。</div>
<div></div>
<div><strong>1.1.4 事务管理类 </strong></div>
<div> 图层的动画属性的每一个修改必然是事务的一个部分。CATransaction 是核心动画里面负责协调多个动画原子更新显示操作。事务支持嵌套使用。</div>
<div></div>
<div></div>
<div><strong>第二章 核心动画渲染框架</strong></div>
<div> 可能有人会很好奇CoreAnimation是如何渲染动画，动画是如何生成的。</div>
<div> 在core aniamtion和cocoa view之间有很大的相似之处，他们之间最大的概念上的分歧就是layer不直接渲染到屏幕上。</div>
<div>在MVC的设计模式下，NSView和UIView是视图对象，core animation层实际上是模型对象。他们封装了几何图形，时间和可视属性，同时提供显示的内容，但是实际上显示并不是layer的责任。</div>
<div>每一个可视的layer tree后面都有两个相应的tree：presentation tree和render tree。如下图所示：</div>
<div></div>
<div><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200212.jpg" alt="" width="654" height="254" align="center" /></div>
<div></div>
<div>layer tree包含了每个layer的对象模型。当你为一个layer的属性设置一个的时候，他们的值就是你设置的。</div>
<div>The presentation tree包含了当前正在呈现给用户作为动画发生的值。例如：对一个layer的backgroundcolor设置一个新的值的时候，在layer tree中的值会马上改变。然而，在presentation tree的相应层的backgroundcolor的值随着要显示给用户的插值颜色会被更新。</div>
<div>当渲染一个layer的时候，the render-tree会使用presentation-tree的值。the render-tree的责任就是执行独立与程序活动的合成操作；渲染是在一个单独进程或者线程中，以便使其对应用程序的run loop影响最小。</div>
<div>当一个动画在执行的过程中，你可以查询相应的presentation layer的实例。如果你打算改变当前的动画并且从当前显示状态开始一个新的动画，这是非常有用的。</div>
<div></div>
<div><strong> 第三章  图层的几何和变化</strong></div>
<p>&nbsp;</p>
<div> 图层的几何变化涉及到修改图层的几何属性，比如大小，锚点，圆角等属性等等，这个部分详细的可以查看Quartz 2D 的文档，这个文档讲的比较详细。</div>
<div></div>
<div><strong> 3.1图层的坐标系</strong></div>
<p>图层的坐标系在不同平台上面具有差异性。在 iOS 系统中,默认的坐标系统原点 在图层的中心左上角地方,原点向右和向下为正值。在 Mac OS X 系统中,默认的坐 标系原点在图层的中心左下角地方,原点向右和向上为正值。坐标系的所有值都是浮 点类型。你在任何平台上面创建的图层都采用该平台默认的坐标系。</p>
<div>每个图层定义并维护自己的坐标系,它里面的全部内容都由此相关的坐标系指定 位置。该准则同时适应于图层自己的内容和它的任何子图层。因为任何图层定义了它 自己的坐标系,CALayer 类提供相应的方法用于从一个图层坐标系的点、矩形、大小 值转化为另一个图层坐标系相应的值。</div>
<div>一些基于图层的属性使用单元坐标空间测量它们的值。单元坐标空间指定图层边 界的相对值,而不是绝对值。单元坐标空间给定的 x 和 y 的值总是在 0.0 到 1.0 之间。 指定一个沿 X 轴的值为 0.0 的点,得到的是图层左边缘的一个点,而指定一个 1.0 的点,则是图层右边缘的一个点。(对 Y 轴而言,如果是在 iOS 系统,则 0.0 对应于 顶部的点,而 1.0 则是底部的点,而在 Mac OS X 系统,得到的刚好相反,就如之前 提到的坐标系不同一样)。而点(0.5,0.5)则刚好是图层的中心点。</div>
<p>&nbsp;</p>
<p><strong> 3.2指定图层的几何</strong></p>
<div>虽然图层和图层树与视图和视图的结构在很多方面具有相似性,但是图层的几何 却不同,它更加简单通俗。图层的所有几何属性,包括图层的矩阵变换,都可以隐式 和显式动画。</div>
<p>下图显示可以在上下文中指定图层几何的属性:</p>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200213.png" alt="" align="center" /></p>
<div>图层的 position 属性是一个 CGPoint 的值,它指定图层相当于它父图层的位置, 该值基于父图层的坐标系。</div>
<div>图层的 bounds 属性是一个 CGRect 的值,指定图层的大小(bounds.size)和图层的 原点(bounds.origin)。当你重写图层的重画方法的时候,bounds 的原点可以作为图形 上下文的原点。</div>
<div>图层拥有一个隐式的 frame,它是 position,bounds,anchorPoint 和 transform 属性 的一部分。设置新的 frame 将会相应的改变图层的 position 和 bounds 属性,但是 frame 本身并没有被保存。但是设置新的 frame 时候,bounds 的原点不受干扰,bounds 的大 小变为 frame 的大小,即 bounds.size=frame.size。图层的位置被设置为相对于锚点 (anchor point)的适合位置。当你设置 frame 的值的时候,它的计算方式和 position、 bounds、和 anchorPoint 的属性相关。</div>
<div>图层的 anchorPoint 属性是一个 CGPoint 值,它指定了一个基于图层 bounds 的符 合位置坐标系的位置。锚点(anchor point)指定了 bounds 相对于 position 的值,同 时也作为变换时候的支点。锚点使用单元空间坐标系表示,(0.0,0.0)点接近图层 的原点,而(1.0,1.0)是原点的对角点。改变图层的父图层的变换属性(如果存在 的话)将会影响到 anchorPoint 的方向,具体变化取决于父图层坐标系的 Y 轴。</div>
<div>当你设置图层的 frame 属性的时候,position 会根据锚点(anchorPoint)相应的改 变,而当你设置图层的 position 属性的时候,bounds 会根据锚点(anchorPoint)做相应的改变。</div>
<p>&nbsp;</p>
<div>下图描述了基于锚点的三个示例值:</div>
<p>&nbsp;</p>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200214.png" alt="" align="center" /></p>
<div>anchorPoint 默认值是(0.5,0.5),位于图层边界的中心点(如上图显示),B 点 把 anchorPoint 设置为(0.0,0.5)。最后 C 点(1.0,0.0)把图层的 position 设置为 图层 frame 的右下角。该图适用于 Mac OS X 的图层。在 iOS 系统里面,图层使用不 同的坐标系,相应的(0.0,0.0)位于左上角,而(1.0,1.0)位于右下角。</div>
<p>图层的 frame、bounds、position 和 anchorPoint 关系如下图所示:</p>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200215.png" alt="" align="center" /></p>
<p>在该示例中,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)。</p>
<div>如果你新创建一个图层,则只有设置图层的 frame 为(40.0,60.0,120.0,80.0),</div>
<div>相应的 position 属性值将会自动设置为(100.0,100.0),而 bounds 会自动设置为 (0.0,0.0,120.0,80.0)。</div>
<div>下图显示一个图层具有相同的 frame(如上图),但是在该图中它的 anchorPoint 属性值被设置为(0.0,0.0),位于图层的左下角位置。</div>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200216.png" alt="" align="center" /></p>
<p>图层的 frame 值同样为(40.0,60.0,120.0,80.0),bounds 的值不变,但是图层的 position 值已经改变为(40.0,60.0)。</p>
<div>图层的几何外形和 Cocoa 视图另外一个不同地方是,你可以设置图层的一个边角 的半径来把图层显示为圆角。图层的 cornerRadius 属性指定了重绘图层内容,剪切子 图层,绘制图层的边界和阴影的时候时候圆角的半径。</div>
<p>图层的 zPosition 属性值指定了该图层位于 Z 轴上面位置,zPosition 用于设置图层 相对于图层的同级图层的可视位置</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong> 3.3 图层的几何变换</strong></p>
<div>图层一旦创建,你就可以通过矩阵变换来改变一个图层的几何形状。</div>
<div>CATransform3D 的数据结构定义一个同质的三维变换(4&#215;4 CGFloat 值的矩阵),用于 图层的旋转,缩放,偏移,歪斜和应用的透视。</div>
<div>图层的两个属性指定了变换矩阵:transform 和 sublayerTransform 属性。图层的 transform 属性指定的矩阵结合图层的 anchorPoint 属性作用于图层和图层的子图层上 面。图 3 显示在使用 anchorPoint 默认值(0.5,0.5)的时候旋转和缩放变换如何影响一个图层。而图 4 显示了同样的矩阵变换在 anchorPoint 为(0.0,0.0)的时候如何改变一 个图层。图层的 sublayerTransform 属性指定的矩阵只会影响图层的子图层,而不会对 图层本身产生影响。</div>
<div>你可以通过以下的任何一个方法改变 CATransform3D 的数据结构:</div>
<div>(1) 使用CATransform3D函数</div>
<div>(2) 直接修改数据结构的成员</div>
<div>(3) 使用键-值编码改变键路径</div>
<p>CATransform3DIdentity 是单位矩阵,该矩阵没有缩放、旋转、歪斜、透视。把该 矩阵应用到图层上面,会把图层几何属性修改为默认值。</p>
<p><strong> 3.3.1 变换函数</strong></p>
<div>使用变换函数可以在核心动画里面在操作矩阵。你可以使用这些函数(如下表)去 创建一个矩阵一般后面用于改变图层或者它的子图层的 transform 和 sublayerTransform属性。变换函数或者直接操或者返回一个CATransform3D的数据结 构。这可以让你能够构建简单或复杂的转换,以便重复使用。</div>
<div><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200217.png" alt="" align="center" /></div>
<div>核心动画 提供了用于转换矩阵的变换函数 CATransform3DInvert。一般是用反转 点内转化对象提供反向转换。当你需要恢复一个已经被变换了的矩阵的时候,反转将 会非常有帮助。反转矩阵乘以逆矩阵值,结果是原始值。</div>
<div>变换函数同时允许你把 CATransform3D 矩阵转化为 CGAffineTransform(仿射) 矩阵,前提是 CATransform3D 矩阵采用如下表示方法。</div>
<div></div>
<div><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200218.png" alt="" align="center" /></div>
<div>变换函数同时提供了可以比较一个变换矩阵是否是单位矩阵,或者两个矩阵是否 相等。</div>
<div><strong><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET26305201203071200219.png" alt="" align="center" /><br />
</strong></div>
<div><strong>3.3.2 修改变换的数据结构</strong></div>
<div>你可以修改 CATransform3D 的数据结构的元素为任何其他你想要的数据值。清单 1 包含了 CATransform3D 数据结构的定义,结构的成员都在其相应的矩阵位置。</div>
<div>??</div>
<div>s??????truct CATransform3D</div>
<div>               {</div>
<div>                 CGFloat m11, m12, m13, m14;</div>
<div>                 CGFloat m21, m22, m23, m24;</div>
<div>                 CGFloat m31, m32, m33, m34;</div>
<div>                 CGFloat m41, m42, m43, m44;</div>
<div>                 };</div>
<div>               typedef struct CATransform3D CATransform3D;</div>
<div></div>
<div>               清单 2 中的示例说明了如何配置一个 CATransform3D 一个角度变换。</div>
<div>              <img src="http://www.189works.com/data/attachment/portal/et2/201203/ET263052012030712002110.png" alt="" align="center" /></div>
<div></div>
<div>  <strong> 3.3.3 通过键值路径修改变换</strong></div>
<div>    核心动画扩展了键-值编码协议,允许通过关键路径获取和设置一个图层的 CATransform3D 矩阵的值。表 4 描述了图层的 transform 和 sublayerTransform 属性的相应关键路径。</div>
<div>    <img src="http://www.189works.com/data/attachment/portal/et2/201203/ET263052012030712002111.png" alt="" width="781" height="657" align="center" /></div>
<div></div>
<div>    你不可以通过 Objective-C 2.0 的属性来设置结构域的值,比如下面的代码将会无法正常运行:</div>
<div></div>
<div>    myLayer.transform.rotation.x=0;</div>
<div></div>
<div>    替换的办法是,你必须通过 setValue:forKeyPath:或者 valueForKeyPath:方法, 具体如下:</div>
<div>          [myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@&#8221;transform.rotation.x&#8221;];</div>
<p>&nbsp;</p>
<p><strong> 3.4 图层的操作</strong></p>
<p>图层有一个图层树，既然是树，就允许添加，插入，删除，替换相应的图层，</p>
<div> 这些操作都可以通过已有的api实现，api如下</div>
<div><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET263052012030712002112.png" alt="" align="center" /></div>
<p>&nbsp;</p>
<div></div>
<div></div>
<div><strong> 3.5 图层的内容</strong></div>
<div> 图层的内容提供，是指通过一种方法来制定CALayer 实例的内容:</div>
<div> 其中有一下三种方式来提供CAlayer的内容</div>
<div>  （1）使用包含图片内容的 CGImageRef 来显式的设置图层的 contents 的属性。</div>
<div>  （2）指定一个委托,它提供或者重绘内容。</div>
<div>  （3）继承 CALayer 类重载显示的函数。</div>
<p>&nbsp;</p>
<div></div>
<div><strong>第四章 动画</strong></div>
<div>动画是当今用户界面的关键因素。当使用核心动画的时候,动画是自动完成的。 没有动画的循环和计数器。你的应用程序不负负责重绘,也不负责跟踪动画的当前状 态。动画在独立线程里面自动执行,没有和你的应用程序交互。</div>
<div>核心动画提供了一套你可以在你应用程序里面使用的动画类的表现:</div>
<div>  （1）CABasicAnimation提供了在图层的属性值间简单的插入。</div>
<div>  （2）CAKeyframeAnimation 提供支持关键帧动画。你指定动画的一个图层属性的关键路径,一个表示在动画的每个阶段的价值的数组,还有一个关键帧时间的数组和时间函数。</div>
<div>  （3）CATransition提供了一个影响整个图层的内容过渡效果。在动画显示过程中采用淡出(fade)、推出(push)、显露(reveal)图层的内容。 常用的过渡效果可以通过提供你自己定制的核心图像滤镜来扩展。除了要指定显示的动画类型,你还必须指定动画的间隔、它的速度(它的插值如何分布在整个动画过程)、动画循环时候的循环次数、动画周期完成的时候是否自动 的反转、还有动画结束的时候它的可视化状态。动画类和 CAMediaTiming 协议提供 所有这些功能甚至更多的功能。CAAnimation、它的子类、时序协议被核心动画和Cocoa Animation Proxy功能共享。这些类将会在“动画类型和时序编程指南(Animation Types and Timing Programming Guide)”里面详细介绍。</div>
<p>Core Animation 类的继承关系图</p>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET263052012030712002113.png" alt="" width="448" height="462" align="center" /></p>
<div></div>
<p>&nbsp;</p>
<div> 下面将针对上面的知识做一个图片动画的demo</div>
<p><img src="http://www.189works.com/data/attachment/portal/et2/201203/ET263052012030712002114.png" alt="" align="center" /></p>
<p>&nbsp;</p>
<p><strong>功能1 ：移动图片到右下角</strong></p>
<p>&nbsp;</p>
<div>//向右下角缩小移动<br />
- (IBAction)buttonClick:(id)sender<br />
{CGPoint fromPoint = imageView.center;//路径曲线<br />
UIBezierPath *movePath = [UIBezierPath bezierPath];<br />
[movePath moveToPoint:fromPoint];<br />
CGPoint toPoint = CGPointMake(300, 460);<br />
[movePath addQuadCurveToPoint:toPoint<br />
controlPoint:CGPointMake(toPoint.x,fromPoint.y)];//关键帧<br />
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];<br />
moveAnim.path = movePath.CGPath;<br />
moveAnim.removedOnCompletion = YES;//旋转变化<br />
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];<br />
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];<br />
//x，y轴缩小到0.1,Z 轴不变<br />
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];<br />
scaleAnim.removedOnCompletion = YES;</p>
<p>//透明度变化<br />
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];<br />
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];<br />
opacityAnim.toValue = [NSNumber numberWithFloat:0.1];<br />
opacityAnim.removedOnCompletion = YES;</p>
<p>//关键帧，旋转，透明度组合起来执行<br />
CAAnimationGroup *animGroup = [CAAnimationGroup animation];<br />
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim,opacityAnim, nil];<br />
animGroup.duration = 1;<br />
[imageView.layer addAnimation:animGroup forKey:nil];</p>
</div>
<p>}</p>
<p><strong>功能2 ：移动图片到右下角</strong></p>
<p>//向右边旋转</p>
<div>
<div>- (IBAction)rightRotateBtnClick:(id)sender<br />
{<br />
CGPoint fromPoint = imageView.center;<br />
UIBezierPath *movePath = [UIBezierPath bezierPath];<br />
[movePath moveToPoint:fromPoint];<br />
CGPoint toPoint = CGPointMake(fromPoint.x +100 , fromPoint.y) ;[movePath addLineToPoint:toPoint];CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];<br />
moveAnim.path = movePath.CGPath;CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];<br />
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];//沿Z轴旋转<br />
scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,0,0,1)];</p>
<p>//沿Y轴旋转<br />
// scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,0,1.0,0)];</p>
<p>//沿X轴旋转<br />
// scaleAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(M_PI,1.0,0,0)];<br />
scaleAnim.cumulative = YES;<br />
scaleAnim.duration =1;<br />
//旋转2遍，360度<br />
scaleAnim.repeatCount =2;<br />
imageView.center = toPoint;<br />
scaleAnim.removedOnCompletion = YES;<br />
CAAnimationGroup *animGroup = [CAAnimationGroup animation];<br />
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];<br />
animGroup.duration = 2;</p>
<p>[imageView.layer addAnimation:animGroup forKey:nil];</p>
<p>}</p>
</div>
</div>
<div></div>
<p><strong>功能3 </strong><strong>：图片旋转360度</strong></p>
<p>&nbsp;</p>
<div>
<div>//图片旋转360度<br />
- (IBAction)rota360BtnClick:(id)sender<br />
{<br />
CABasicAnimation *animation = [ CABasicAnimation<br />
animationWithKeyPath: @"transform" ];<br />
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];//围绕Z轴旋转，垂直与屏幕<br />
animation.toValue = [ NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0, 0, 1.0) ];<br />
animation.duration = 1;<br />
//旋转效果累计，先转180度，接着再旋转180度，从而实现360旋转<br />
animation.cumulative = YES;<br />
animation.repeatCount = 2;//在图片边缘添加一个像素的透明区域，去图片锯齿<br />
CGRect imageRrect = CGRectMake(0, 0,imageView.frame.size.width, imageView.frame.size.height);<br />
UIGraphicsBeginImageContext(imageRrect.size);<br />
[imageView.image drawInRect:CGRectMake(1,1,imageView.frame.size.width-2,imageView.frame.size.height-2)];<br />
imageView.image = UIGraphicsGetImageFromCurrentImageContext();<br />
UIGraphicsEndImageContext();[imageView.layer addAnimation:animation forKey:nil];<br />
}</p>
</div>
</div>
<p>&nbsp;</p>
<div>参考文档：</div>
<div>CoreAnimation官方文档地址</div>
<div>http://blog.163.com/donald_wong5/blog/static/190962406201191912456928/</div>
<p>Core Animation for Mac OS X and the iPhone   下载地址</p>
<p>http://www.cocoachina.com/bbs/read.php?tid=12133&#038;ordertype=asc</p>
<p>http://xxxxxfsadf.iteye.com/blog/565785</p>
<p>核心动画编程指南</p>
<p>Quartz 2D官方文档</p>
<div> https://developer.apple.com/library/prerelease/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP30001066</div>
<div></div>
<p>项目文件下载</p>
<p>开源Core Animation 示例CA360</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/112/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Core animation简介</title>
		<link>http://www.chenbaocheng.com/core-animation%e7%ae%80%e4%bb%8b/</link>
		<comments>http://www.chenbaocheng.com/core-animation%e7%ae%80%e4%bb%8b/#comments</comments>
		<pubDate>Fri, 18 May 2012 11:08:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=95</guid>
		<description><![CDATA[1.    简介 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 的子类，支持层在动画期间，为层指定一个关键路径。 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1.    简介</strong></p>
<p>Core animation 是以objc语言封装的一套图形渲染，投影及动画的库的集合。<br />
Core animation 使创建用户界面变得非常容易，通过以下方法：<br />
1.    使用简单的编程方法实现高性能的合成<br />
2.    使用层对象创建复杂的用户界面<br />
3.    轻量型数据结构，能够同时使几百个层产生动画。<br />
4.    不依赖于应用程序主线程，动画在单独的线程里运行。<br />
5.    改进了应用程序性能。应用程序只需要重画它变化的部分（局部刷新）。<br />
6.    灵活的布局管理模式。</p>
<p><strong>2.    相关类</strong><br />
使用core animation，开发者不需要使用底层的API或者OpenGL就可以创建漂亮的动画界面。<br />
core animation类分成以下几个：<br />
1.    提供显示内容的层(layer)。<br />
2.    动画和时间类(Animation and timing classes)。<br />
3.    布局和约束类(Layout and constraint classes)。<br />
4.    将多个层分成几个原子更新的执行类。</p>
<p>2.1    层(layrer)</p>
<p>层 是 core animation的基础。视图(UIView)的一个实例，有一个CALayer实例做为父层(superlayer) 以及在这层上添加的所有子层，创建的层结构称为layer tree（层之间的结构像一颗树）。在画层时，所有的层指定一个相对于父层的坐标，然后从最后一层往前画，就像画视图一样。层允许更复杂的转换，比如旋 转，倾斜，放大缩小，投影层的内容。<br />
层还管理与其相关的动画和作用(action，这里翻译不形象，高手请指教)。从layer tree中插入或者删除层，修改层的属性以及应用程序请求都会触发动画发生。</p>
<p>2.2动画和时间类</p>
<p>    隐式动画<br />
层的许多可视属性的改变可以产生隐式的动画效果，因为这些属性都默认地与一个动画相关联。通过简单地设置可视的属性值，层会由当前值到被设置的值产生渐变的动画效果。比如，设置层的隐藏属性为真，将触发一个逐渐消失的动画效果。<br />
    显式动画<br />
可设置动画的属性也可以产生显式的动画效果，通过创建一个动画类和指定所需要的动画效果。显式的动画并不改变层的属性。<br />
所 有的核心动画类都由抽象类CAAnimation继承而来。CAAnimation采用CAMediaTiming协议。 CAMediaTiming规定了动画的持续时间，速度及重复次数。CAAnimation也采用了CAAction协议，该协议规定了在响应由层触发的 动作时，开始一个动画的标准方式。</p>
<p>核心动画还提供了其它 的动画类：<br />
    CATransition。CATransition规定了影响整个层内容的转换效果。在动画期间，它使层产生渐变(fade)，推拉(push)以及揭示(reveal)的动画效果。这些常用的转换效果可以通过核心绘图过滤器进行扩展。<br />
核心绘图过滤器相关中文链接: <a href="http://www.apple.com.cn/developer/Documentation/GraphicsImaging/Conceptual/CoreImaging/index.html" target="_blank">http://www.apple.com.cn/developer/Documentation/GraphicsImaging/Conceptual/CoreImaging/index.html</a><br />
    CAAnimation。CAAnimation允许大量的动画对象被分成几组,并且可以同时运行。<br />
    CAPropertyAnimation 。是CAAnimation 的子类，支持层在动画期间，为层指定一个关键路径。<br />
    CABasicAnimation。该类为层的属性提供了简单的插值。(我理解为:由于要产生动画，因此为了使在开始和结束期间产生动画，要为层属性所设置的区间值插入其它的值。)<br />
    CAKeyframeAnimation。 CAKeyframeAnimation提供关键帧动画的支持。你可以为可设置动画的层的属性指定一个关键路径，路径可以是一个数组，保存了动画每个阶段 的    值，和关键帧的动画次数及时间函数。当动画运行时，在插值时，每个值会被轮流使用。</p>
<p>2.3布局管理类：<br />
CAKeyframeAnimation类用于管理所有子层的布局。每个由CAConstraint类封装的实例描述了各子层之间的几何位置关系。</p>
<p>2.4执行管理类<br />
可设置动画层的属性的修改必须是执行的一部分。CATransaction负责将许多动画分成几批原子型的更新进行显示。</p>
<p><strong>3.    类层次图</strong></p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/77833f87177b2d7bc65cc389.jpg"><img class="alignnone size-full wp-image-97" title="77833f87177b2d7bc65cc389" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/77833f87177b2d7bc65cc389.jpg" alt="" width="752" height="492" /></a></p>
<p>&nbsp;</p>
<div align="center"><strong>第三章     层的坐标及转换</strong></div>
<p>这章节主要描述层坐标的构成要素，构成要素之间的关系及如何转换产生复杂的效果。</p>
<p><strong>1    层坐标系统</strong><br />
层 坐标使用了和Quanz图形一样的坐标系统。默认情况下，原点(0.0, 0.0)在左下角，向右及向上增长。请注意：该坐标系统是不同于UIView实例的坐标系统，UIView系统的原点在左上角，向右及向下增长。每个层的 实例都维护自己的坐标系统，定位所有的子层及绘图时都是相对于这个坐标系统。</p>
<p><strong>2    层的几何坐标</strong><br />
层的几何坐标系统图：</p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/ff8b4616bb5c551b21a4e924.jpg"><img class="alignnone size-full wp-image-99" title="ff8b4616bb5c551b21a4e924" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/ff8b4616bb5c551b21a4e924.jpg" alt="" width="633" height="382" /></a></p>
<p><strong>2.1     Bounds</strong><br />
没有人不知道这东东，跳过。</p>
<p><strong>2.2    Position</strong><br />
CGPoint类型，指定了相对于父层(superlayer)的位置，由父层的坐标系统来表示。<br />
<strong>2.3    Frame</strong><br />
改变层的frame时，层的position和bounds会相应的改变，但层并没有frame属性，它是由层的position, bounds, anchorPoint（参照点） 和transform计算而来。</p>
<p><strong>2.4    Anchor point 参照点</strong><br />
今天的重点属性。一定要理解。该属性是在层的bounds范围内的一个点，值为0.0到1.0。所有的转换都是相对于这个点进行计算的。<br />
下图是三个anchor point的值：</p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/20524a4af8da5c7208f7ef24.jpg"><img class="alignnone size-full wp-image-100" title="20524a4af8da5c7208f7ef24" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/20524a4af8da5c7208f7ef24.jpg" alt="" width="651" height="569" /></a></p>
<p>接下来，我们来看一下frame, bounds, position 及 anchorPoint之间的关系。<br />
如下图：</p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/44879552445c685f0df3e324.jpg"><img class="alignnone size-full wp-image-101" title="44879552445c685f0df3e324" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/44879552445c685f0df3e324.jpg" alt="" width="915" height="360" /></a></p>
<p>在 这个图中，anchor point的默认值为（0.5,0.5），相当于层的中心。如果你设置frame为(40.0, 60.0, 120.0, 80.0)，则position值会被自动设置为（100，100）。我们还可以看到旋转和缩放的转换计算都是相对于参照点进行的。</p>
<p>下图的frame的大小和图3是一样的，但是anchor point为(0.0,0.0):</p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/4183d2ca9bb51017f31fe724.jpg"><img class="alignnone size-full wp-image-103" title="4183d2ca9bb51017f31fe724" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/4183d2ca9bb51017f31fe724.jpg" alt="" width="934" height="369" /></a></p>
<p><strong>2.5    cornerRadius</strong><br />
当要绘图，剪辑子层，画边框及阴影时，可以指定层所使用的半径大小以产生圆角效果。</p>
<p><strong>3    层的几何坐标转换</strong><br />
上面讲了那么多，都是为这一小节坐铺垫的。<br />
CATransform3D结构体定义了一个用于旋转，缩放，偏移，倾斜及应用透视变换<br />
的三维坐标变换。原型如下：<br />
struct CATransform3D<br />
{<br />
CGFloat m11, m12, m13, m14;<br />
CGFloat m21, m22, m23, m24;<br />
CGFloat m31, m32, m33, m34;<br />
CGFloat m41, m42, m43, m44;<br />
};<br />
typedef struct CATransform3D CATransform3D;<br />
可以将该结构体赋值给层的两个属性transform 或者sublayerTransform，就可以实现坐标转换。</p>
<p>你可以通过以下三个方法来创建和修改这个结构体：<br />
1)    使用CATransform3D函数获取<br />
2)    直接修改结构体数据成员<br />
3)    使用键值编码和键路径(key paths)</p>
<p><strong>3.1    转换函数</strong></p>
<p><strong>3.1.1    平移，缩放及旋转转换函数（以下如何进行坐标转换计算实在是看不懂，线性代数太滥了，真后悔当初没好好学，^&amp;^。高手请指教）：</strong></p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/bf6fbb098f1dec756a60fb24.jpg"><img class="alignnone size-full wp-image-104" title="bf6fbb098f1dec756a60fb24" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/bf6fbb098f1dec756a60fb24.jpg" alt="" width="905" height="542" /></a></p>
<p>示例：<br />
reflectionLayer.transform = CATransform3DMakeScale(1.0, -1.0, 1.0);<br />
该函数使层的Y坐标反转，产生倒影效果。<br />
论谈里有一个关于CATransform3DMakeScale矩阵转换的使用例子，大家可以看一下，对于理解矩阵转换还是很有帮助的，地址：<a href="http://www.cocoachina.com/macdev/ca/2009/0611/33.html" target="_blank">http://www.cocoachina.com/macdev/ca/2009/0611/33.html</a></p>
<p>系统也提供了反转矩阵的函数CATransform3DInvert。</p>
<p><strong>3.1.2    仿射转换函数：</strong><br />
<a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/261009336f3af1a91b4cff24.jpg"><img class="alignnone size-full wp-image-105" title="261009336f3af1a91b4cff24" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/261009336f3af1a91b4cff24.jpg" alt="" width="895" height="311" /></a></p>
<p><strong>3.1.3    测试是否是相等的函数：</strong></p>
<p><a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/ca34eef8f0324b5ed8f9fd24.jpg"><img class="alignnone size-full wp-image-106" title="ca34eef8f0324b5ed8f9fd24" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/ca34eef8f0324b5ed8f9fd24.jpg" alt="" width="811" height="193" /></a></p>
<p><strong>3.2    使用键路径(key paths)修改转换函数</strong> <a href="http://www.chenbaocheng.com/wp-content/uploads/2012/05/573c540f3587cd7b6159f324.jpg"><img class="alignnone size-full wp-image-107" title="573c540f3587cd7b6159f324" src="http://www.chenbaocheng.com/wp-content/uploads/2012/05/573c540f3587cd7b6159f324.jpg" alt="" width="890" height="594" /></a></p>
<p>示例：<br />
myLayer.transform.rotation.x=0;<br />
[myLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@&#8221;transform.rotation.x&#8221;];</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/core-animation%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS开发 &#8211; 动态添加按钮</title>
		<link>http://www.chenbaocheng.com/ios%e5%bc%80%e5%8f%91-%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0%e6%8c%89%e9%92%ae/</link>
		<comments>http://www.chenbaocheng.com/ios%e5%bc%80%e5%8f%91-%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0%e6%8c%89%e9%92%ae/#comments</comments>
		<pubDate>Fri, 18 May 2012 05:49:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=92</guid>
		<description><![CDATA[UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setFrame:CGRectMake(100, 100, 100, 40)]; [button setTitle:@&#34;弹出窗口&#34; forState:UIControlStateNormal]; [button addTarget:self action:@selector(alertButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:test]; - (void)alertButtonClick:(id)sender { NSLog(@&#34;button click.&#34;); }]]></description>
			<content:encoded><![CDATA[<pre class="wp-code-highlight prettyprint">
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(100, 100, 100, 40)];
[button setTitle:@&quot;弹出窗口&quot; forState:UIControlStateNormal];
[button addTarget:self action:@selector(alertButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:test];

- (void)alertButtonClick:(id)sender {
    NSLog(@&quot;button click.&quot;);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/ios%e5%bc%80%e5%8f%91-%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0%e6%8c%89%e9%92%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS开源项目汇总</title>
		<link>http://www.chenbaocheng.com/ios%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e6%b1%87%e6%80%bb/</link>
		<comments>http://www.chenbaocheng.com/ios%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e6%b1%87%e6%80%bb/#comments</comments>
		<pubDate>Fri, 18 May 2012 03:06:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=89</guid>
		<description><![CDATA[UI界面类项目： 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放大镜效果 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UI界面类项目：</strong></p>
<p><a href="http://code.google.com/p/panoramagl/downloads/list">Panoramagl</a> —— 720全景展示<br />
Panorama viewer library for iPhone, iPad and iPod touch</p>
<p><a href="https://github.com/jdg/MBProgressHUD">MBProgressHUD</a> —— 进度指示<br />
一种优雅的，半透明的进度显示效果。同时还提供了其他附加功能，比如显示完成信息并淡出。</p>
<p><a href="https://github.com/nicklockwood/iCarousel">iCarousel</a>  —— 效果很酷的分页排列<br />
内容类似的页面需要并排列出来，供用户选择。iCarousel具有非常酷的3D效果，比如经典的CoverFlow, TimeMachine。另外还具有线性，圆柱状等其它效果。可用于图片选择，书籍选择，网页选择等。</p>
<p><a href="http://code.google.com/p/core-plot/">CorePlot</a> —— 2D图形绘图<br />
数据可视化，可以绘制漂亮的棒状图、饼状图、线状图等等。</p>
<p><a href="https://github.com/klazuka/Kal">kal</a> —— iPhone日历控件<br />
一个类似于ios系统默认日历开源日历库，支持添加事件，自定义日历样式等功能。</p>
<p><a href="https://github.com/enormego/EGOTableViewPullRefresh">EGOTableViewPullRefresh</a> —— 下拉列表刷新<br />
使用这个库，很容易就可以实现下拉刷新效果。微博，RSS阅读器之类的软件经常使用。</p>
<p><a href="https://github.com/chrismiles/CMPopTipView">CMPopTipView</a> —— 泡泡风格的提示界面<br />
一个泡泡风格的提示框开源控件, 继承自UIView。iPad,iPhone通用。</p>
<p><a href="https://github.com/Split82/HMGLTransitions">HMGLTransitions</a> —— 视图切换动画<br />
提供一些UIView或UIViewController切换时候的3D动画效果。比如翻转，开门，撕纸等。</p>
<p><a href="https://github.com/escoz/QuickDialog/">QuickDialog</a> —— 表格风格的配置界面<br />
在iphone, 通常使用UITableView来创建一些配置，登录界面，创建这些界面通常很机械很烦人。QuickDialog可以快速地在表格项中放置开关On/Off控件、日期控件、Sliders、单选按钮编辑框等等。这样就不用使用低级的UITableView。</p>
<p><a href="https://github.com/jasonmorrissey/JMTabView">JMTabView</a>  —— 自定义标签栏和Tabbar<br />
JMTabView是一个iOS自定义的标签栏开源控件，界面效果完全使用Core Graphics绘制，而没有用图片，所以内容很容易改为你需要的。</p>
<p><a href="https://github.com/blommegard/SBTableAlert">SBTableAlert</a> —— 带表格视图的消息对话框<br />
SBTableAlert对话框中提供了一种方式，在UIAlertView视图中包含了UITableView的效果，从而可以实现在UIAlertView中进行表格多选。使用简单。</p>
<p><a href="https://github.com/alekseyn/EasyTableView">EasyTableView</a> —— 可水平或垂直滚动的TableView<br />
原始的UITableView只可以垂直滚动。EasyTableView可以很方便的实现TableView的水平滚动, 并可重复实现用户自定义的View，就类似重复使用UITableViewCell, 这对于提高效率很有帮助。</p>
<p><a href="https://github.com/myell0w/MTStatusBarOverlay/">MTStatusBarOverlay</a>  —— 在状态栏上显示自定义的View<br />
iOS程序通常会在最上面出现一个状态栏。使用这个库，可以很方便的在状态栏上显示一些信息，比如下载进度等。</p>
<p><a href="https://github.com/acoomans/iOS-MagnifyingGlass"> iOS-MagnifyingGlass</a>  ——IOS放大镜效果<br />
可以选择放大镜的样式，和放大倍数</p>
<p>&nbsp;</p>
<p><strong>非UI界面类：</strong></p>
<p><a href="http://regexkit.sourceforge.net/RegexKitLite/">RegexKitLite</a> —— 正则表达式<br />
要在字符串中抽取某些特定内容，或者检查输入合法性，很多时候需要用到正则表达式。RegexKitLite对NSString做了扩展, 支持正则表达的查找，替换等。</p>
<p><a href="http://www.politepix.com/openears">Openear</a>—— 语音识别和TTS<br />
提供了语音识别和Text-to-speach 的接口</p>
<p><a href="http://allseeing-i.com/ASIHTTPRequest/">ASIHttpRequest</a> —— HTTP Network库<br />
ASIHttpRequest库极大的简化了网络通 信，提供更先进的工具，例如文件上传工具，重定向处理工具、验证工具、等等。</p>
<p><a href="https://github.com/ccgus/fmdbhttps://github.com/robbiehanson/KissXML">KissXml</a> —— xml解析库<br />
很方便的一个xml解析器，支持Xpath查询。</p>
<p><a href="https://github.com/ccgus/fmdb">FMDatabase</a> —— SQLite的Objective-C封装<br />
SQLite的C API对初学者来说实在太麻烦太琐碎，难度太高。 FMDB说穿了其实只是把C API包装成简单易用的Objective-C类。对于SQLite初学者来说，大大减低了上手的难度。有了FMDB，写程式时只要专心在SQLite的语法上，而不用去理那堆有看没有懂的C API，实在是件快乐的事情。</p>
<p><a href="https://github.com/stig/json-framework/">jsonframework</a> —— JSON支持<br />
它是一个开源框架，基于BSD协议发布。由于json-framework是开放源代码的，当你需要使用它时你只需将json的源代码加入到你的工程中。</p>
<p><a href="https://github.com/rs/SDWebImage">SDWebImage</a> —— 简化网络图片处理<br />
用SDWebImage调用网站上的图片，跟本地调用内置在应用包里的图片一样简单。操作也很简单。</p>
<p><a href="http://code.google.com/p/google-toolbox-for-mac/">Google Toolbox for Mac(GTM)</a>—— 从不同Google项目收集的代码<br />
包含各种的工具类。比如字符串的base64及二进制编码解码, 系统版本号比较, 路径查找等等。每个工具类都比较独立, 可单独抽出来使用。</p>
<p><a href="https://github.com/ldandersen/scifihifi-iphone">SFHFKeychainUtils(scifihifi-iphone)</a>—— 保存用户密码到keychain中<br />
为了用户安全，可以使用钥匙串Keychain来保存用户密码。SFHFKeychainUtils封装了钥匙串的访问, 读写，使用起来很方便。</p>
<p><a href="https://github.com/MugunthKumar/MKStoreKit">MKStoreKit</a> —— 程序内购买<br />
程序内购买的流程的封装。</p>
<p><a href="http://giraffelab.com/code/GLGestureRecognizer/">GLGestureRecognizer </a>——手势识别器<br />
封装了多种手势的识别器，例如三角形，长方形，圆形，五角星形等</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/ios%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e6%b1%87%e6%80%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网络编程 &#8211; 检查网络</title>
		<link>http://www.chenbaocheng.com/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e5%b8%b8%e7%94%a8%e7%9a%84%e4%bb%a3%e7%a0%81/</link>
		<comments>http://www.chenbaocheng.com/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e5%b8%b8%e7%94%a8%e7%9a%84%e4%bb%a3%e7%a0%81/#comments</comments>
		<pubDate>Fri, 18 May 2012 02:21:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=79</guid>
		<description><![CDATA[Reachability是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; [...]]]></description>
			<content:encoded><![CDATA[<p>Reachability是Apple提供的示例代码，在xcode的developer document中能找到。将Reachability.h 和 Reachability.m添加到工程，将SystemConfiguration.framework 添加进工程。<br />
Reachability.h 定义了三种网络状态：</p>
<pre class="wp-code-highlight prettyprint">
typedef enum {
    NotReachable = 0, //无连接
    ReachableViaWiFi, //使用3G/GPRS网络
    ReachableViaWWAN  //使用WiFi网络
} NetworkStatus;
</pre>
<p><strong>因此可以这样检查网络状态</strong></p>
<pre class="wp-code-highlight prettyprint">
Reachability *reachability = [Reachability reachabilityWithHostName:@“www.apple.com”];
switch ([reachability currentReachabilityStatus]) {
	case NotReachable:     //没有网络连接
	break;
	case ReachableViaWWAN: //使用3G网络
	break;
	case ReachableViaWiFi: //使用WiFi网络
	break;
}
</pre>
<p><strong>检查网络环境</strong></p>
<pre class="wp-code-highlight prettyprint">
//是否启用WIFI
+ (BOOL) isWifiEnable {
	return [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable;
}

//是否启用3G
+ (BOOL) is3GEnable {
	return [[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable;
}

- (void)viewWillAppear:(BOOL)animated {
	if (self.isWifiEnable() &amp;&amp; self.is3GEnable()) {
		NSLog(@&quot;有网络链接&quot;);
	} else {
		NSLog(@&quot;木有网络链接&quot;);
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b%e5%b8%b8%e7%94%a8%e7%9a%84%e4%bb%a3%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone开发入门 — Objective-C 基础(2)</title>
		<link>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c-%e5%9f%ba%e7%a1%802/</link>
		<comments>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c-%e5%9f%ba%e7%a1%802/#comments</comments>
		<pubDate>Wed, 16 May 2012 16:31:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=65</guid>
		<description><![CDATA[interface @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(@&#34;Drawing a shape...&#34;); } @end protocol delegate datasource]]></description>
			<content:encoded><![CDATA[<p><strong>interface</strong></p>
<pre class="wp-code-highlight prettyprint">
@interface Shape : NSObject {
@private
	NSString *color;
	CGPoint *position;
}
-(void)setColor:(NSString *)aColor;
-(void)drawShape;
@end
</pre>
<p><strong>class</strong></p>
<pre class="wp-code-highlight prettyprint">
@implementation Shape
-(void)setColor:(NSString *)aColor {
	color = aColor;
}
-(void)drawShape {
	NSLog(@&quot;Drawing a shape...&quot;);
}
@end
</pre>
<p><strong>protocol</strong></p>
<p><strong>delegate</strong></p>
<p><strong>datasource</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c-%e5%9f%ba%e7%a1%802/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone开发入门 — Objective-C 基础(1)</title>
		<link>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/</link>
		<comments>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/#comments</comments>
		<pubDate>Wed, 16 May 2012 10:53:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.chenbaocheng.com/?p=27</guid>
		<description><![CDATA[Hello World int main(int argc, char*argv[]) { NSLog(@&#34;Hello World!&#34;); 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 = @&#8221;FAIL.&#8221;; 常用运算符 运算符 含义 + 加 - 减 * 乘 / 除 % 取模 = 赋值 ++ 自增 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Hello World</strong></p>
<pre class="wp-code-highlight prettyprint">
int main(int argc, char*argv[]) {
   NSLog(@&quot;Hello World!&quot;);
   return 0;
}
</pre>
<p><strong></p>
<p>基本数据类型</strong><br />
int, float, double, char</p>
<p><strong>id</strong><br />
id数据类型可以存储任何类型的对象。类似其他面向对象语言里的基类Object。id数据类型在Objective-C里是个非常重要的特性，它是多态和动态绑定的基础。</p>
<p><strong>SEL</strong><br />
SEL类型是Objective-C用来定义方法的关键字,虽然是方法定义，但是不从属于任何类实例，其值通过@selector进行计算，可以简单理解为一个函数指针，实际类型定义是const char*。</p>
<p><strong>BOOL</strong><br />
boolean类型，其值可以是YES和NO，TRUE和FALSE。</p>
<p><strong>nil，NULL，NSNull</strong><br />
nil用来给对象赋值<br />
NULL可以给任何指针赋值<br />
NSNull用于集合操作<br />
虽然都是标示空值，但是应用场合不同，在合适的场合正确赋值可以减少不必要的错误。</p>
<p><strong>定义常量</strong><br />
#define FLAG_OK 1;<br />
#define ERROR_MSG_FAIL = @&#8221;FAIL.&#8221;;</p>
<p><strong>常用运算符</strong></p>
<table width="100%">
<thead>
<tr>
<td width="15%">运算符</td>
<td>含义</td>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>加</td>
</tr>
<tr>
<td>-</td>
<td>减</td>
</tr>
<tr>
<td>*</td>
<td>乘</td>
</tr>
<tr>
<td>/</td>
<td>除</td>
</tr>
<tr>
<td>%</td>
<td>取模</td>
</tr>
<tr>
<td>=</td>
<td>赋值</td>
</tr>
<tr>
<td>++</td>
<td>自增</td>
</tr>
<tr>
<td>&#8211;</td>
<td>自减</td>
</tr>
<tr>
<td>==</td>
<td>等于</td>
</tr>
<tr>
<td>!=</td>
<td>不等于</td>
</tr>
<tr>
<td>&lt; </td>
<td>小于</td>
</tr>
<tr>
<td>&gt;</td>
<td>大于</td>
</tr>
<tr>
<td>>=</td>
<td>大于等于</td>
</tr>
<tr>
<td><=</td>
<td>小于等于</td>
</tr>
<tr>
<td>||</td>
<td>OR</td>
</tr>
<tr>
<td>&#038;&#038;</td>
<td>AND</td>
</tr>
</tbody>
</table>
<p><strong></p>
<p>结构</strong></p>
<pre class="wp-code-highlight prettyprint">
if(n&lt;100) {
   ...
}

if(n&lt;100) {
   ...
} else {
   ...
}

for(int n = 1; n&lt;100; n++) {
   ...
}

for(id i in objs) {
   ...
}

while(i &lt; 100) {
   ...
   i--;
}

switch{
   case 1:
       ...
       break;
   default:
       ...
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.chenbaocheng.com/iphone%e5%bc%80%e5%8f%91%e5%85%a5%e9%97%a8-objective-c%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

