<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_biosli</title><subtitle type="text">随性、激情技术区</subtitle><id>http://feed.cnblogs.com/blog/u/35410/rss</id><updated>2011-09-21T10:28:14Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/35410/rss"/><entry><id>http://www.cnblogs.com/biosli/archive/2011/09/21/iPhone_Code_Review.html</id><title type="text">发一个关于“微笑天使包燕娜&amp;quot;事件的Code Review，希望对大家有用。</title><summary type="text">以下是对“微笑天使包燕娜&amp;quot;事件的Code Review: 1. 问题现象 新用户在iPhone客户端在用新浪微博登录时，用户的名称自动变为“微笑天使包燕娜”。 2. 现象分析 先说明咱们的新用户登录流程， A. 新用户登录时首先向第三方平台，请求用户的用户id(uid) B. 客户端将此uid发送到咱们自己的服务器，服务器返回此用户的uid与数据库对比返回，此用户是一个新用户 C. 客户端收到服务器发送的此用户为新用户的信息，再次利用用户的uid向第三方平台发送请求用户具体信息的消息。 D. 第三方服务器返回用户的具体信息后，客户端再将此信息发送到咱们自己的服务器上保存。 E. 服务</summary><published>2011-09-21T10:28:00Z</published><updated>2011-09-21T10:28:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/09/21/iPhone_Code_Review.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/09/21/iPhone_Code_Review.html"/><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp; 以下是对&amp;#8220;微笑天使包燕娜"事件的Code Review:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.&amp;nbsp;&amp;nbsp;&amp;nbsp; 问题现象&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 新用户在iPhone客户端在用新浪微博登录时，用户的名称自动变为&amp;#8220;微笑天使包燕娜&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.&amp;nbsp;&amp;nbsp;&amp;nbsp; 现象分析&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 先说明咱们的新用户登录流程，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A.&amp;nbsp;&amp;nbsp;&amp;nbsp; 新用户登录时首先向第三方平台，请求用户的用户id(uid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B.&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户端将此uid发送到咱们自己的服务器，服务器返回此用户的uid与数据库对比返回，此用户是一个新用户&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C.&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户端收到服务器发送的此用户为新用户的信息，再次利用用户的uid向第三方平台发送请求用户具体信息的消息。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; D.&amp;nbsp;&amp;nbsp;&amp;nbsp; 第三方服务器返回用户的具体信息后，客户端再将此信息发送到咱们自己的服务器上保存。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; E.&amp;nbsp;&amp;nbsp;&amp;nbsp; 服务器返回修改过新的用户数据，客户端保存，登录过程完毕。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过对登录过程的log信息进行分析发现，在A和B阶段得到的uid，与C阶段发送的uid不相同。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 改变后的uid一直为2147483647。此uid对应新浪微博的用户"微笑天使包燕娜"，因此返回给咱们自己服务器的用户数据一直是这个名称。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 继续定位发现在新浪SDK中，向新浪服务器发送获得用户详细信息(C过程)请求之前，代码进行了一次将uid字符串转换为int，再转换为字符串的过程。而当用户uid非常大，大于int的最大值(2147483647)时，此时uid被转换为int的最大值2147483647。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因此，发送到新浪的uid会一直是&amp;#8220;2147483647&amp;#8221;。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.&amp;nbsp;&amp;nbsp;&amp;nbsp; 解决问题&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在新浪的SDK的WeiboClient类中，将转换int的代码去掉并修改接口直接将字符串传入发送请求的函数中，问题解决。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 修改后的代码如下：&lt;br /&gt;- (void)getUser:(NSString *)userId&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; needAuth = YES;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSString *path = [NSString stringWithFormat:@"users/show.%@", API_FORMAT];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [params setObject: userId forKey:@"user_id"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [super get:[self getURL:path queryParameters:params]];&lt;br /&gt;}&lt;img src="http://www.cnblogs.com/biosli/aggbug/2184349.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/09/21/iPhone_Code_Review.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/06/07/2073993.html</id><title type="text">iOS 5 新功能要点提示</title><summary type="text">新的App新的通知推送功能，学习了Android的推送样式，不会丢消息，添加了新的通知中心。在主界面就可以看见通知，在应用中也可以看见消息通知。iPad上的Safari可以有标签了。ToDo List相机：锁屏下可以直接拍照。还可以用音量键拍照。（开发者是否能用硬件按键来实现功能？）支持自动对焦和自动锁定功能，自动去红眼，直接编辑图片，音量键可以直接拍照了 邮件：新的发信人，联系人拖动拖拽地址栏、旗标邮件、新加入的键盘样式 PC free!!把PC的线剪掉了！！以后不用连线同步了！！HoYEOver The Air:系统升级不用电脑。Game Center:和朋友玩游戏，支持推送。可以根据用户</summary><published>2011-06-06T18:31:00Z</published><updated>2011-06-06T18:31:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/06/07/2073993.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/06/07/2073993.html"/><content type="html">新的App&lt;br /&gt;新的通知推送功能，学习了Android的推送样式，不会丢消息，添加了新的通知中心。&lt;br /&gt;在主界面就可以看见通知，在应用中也可以看见消息通知。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;iPad上的Safari可以有标签了。&lt;br /&gt;&lt;br /&gt;ToDo List&lt;br /&gt;&lt;br /&gt;相机：&lt;br /&gt;锁屏下可以直接拍照。还可以用音量键拍照。（开发者是否能用硬件按键来实现功能？）&lt;br /&gt;支持自动对焦和自动锁定功能，自动去红眼，直接编辑图片，音量键可以直接拍照了 &lt;br /&gt;&lt;br /&gt;邮件：&lt;br /&gt;新的发信人，联系人拖动&lt;br /&gt;&lt;br /&gt;拖拽地址栏、旗标邮件、新加入的键盘样式 &lt;br /&gt;&lt;br /&gt;PC free!!&lt;br /&gt;把PC的线剪掉了！！以后不用连线同步了！！HoYE&lt;br /&gt;&lt;br /&gt;Over The Air:&lt;br /&gt;系统升级不用电脑。&lt;br /&gt;&lt;br /&gt;Game Center:&lt;br /&gt;和朋友玩游戏，支持推送。&lt;br /&gt;可以根据用户游戏行为推荐游戏&lt;br /&gt;用户推荐用户（社交网络）&lt;br /&gt;&lt;br /&gt;iMessager:&lt;br /&gt;iMessage这个东东，允许有iPhone，iPad的用户可以像发短信一样自由通信，这这，这简直是绕过了电信运营商嘛，电信们又杯具了&lt;br /&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2073993.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/06/07/2073993.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/05/13/2045035.html</id><title type="text">iPhone开发中：折腾Status Bar</title><summary type="text">很晚了，不想写太多赘述，试了一个晚上，告诉大家一个事实。常规隐藏，或者显示状态栏的方法有两种。第一，修改info.plist文件，这个能保证起始状态状态栏是什么样式。第二，利用 [[UIApplication sharedApplication] setStatusBarHidden: XX withAnimation: XX];来在程序中实时设定。 好了说说第二种情况： 注意：下面说的所有情况可能不符合苹果公司提供的UI设计规范，因为规范中“建议”大家不要没事老折腾状态栏。（我隐约记得看见过类似内容忘了具体在哪了，待考证）如果你想让你的程序中Status Bar时隐时现，半透明（这里说的半.</summary><published>2011-05-12T18:18:00Z</published><updated>2011-05-12T18:18:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/05/13/2045035.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/05/13/2045035.html"/><content type="html">&lt;p&gt;很晚了，不想写太多赘述，试了一个晚上，告诉大家一个事实。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;常规隐藏，或者显示状态栏的方法有两种。&lt;/p&gt;&lt;p&gt;第一，修改info.plist文件，这个能保证起始状态状态栏是什么样式。&lt;/p&gt;&lt;p&gt;第二，利用&amp;nbsp;&amp;nbsp;&amp;nbsp; [[UIApplication sharedApplication] setStatusBarHidden: XX withAnimation: XX];来在程序中实时设定。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;好了说说第二种情况： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;注意：下面说的所有情况可能不符合苹果公司提供的UI设计规范，因为规范中&amp;#8220;建议&amp;#8221;大家不要没事老折腾状态栏。（我隐约记得看见过类似内容忘了具体在哪了，待考证）&lt;/p&gt;&lt;p&gt;如果你想让你的程序中Status Bar时隐时现，半透明（这里说的半透明是指自己的界面被状态栏挡住），隐藏的时候不会出现烦人的白条儿 。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;那你在离开上一个页面的时候（具体在第一个界面viewWillDisappear里）要隐藏状态栏，进入下一个页面正式显示出页面以后(具体在第二个界面的viewDidAppear里面，如果页面转换有动画要等动画结束后，写个performSelector:withObject:afterDelay:，在回调里)再显示状态栏。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2045035.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/05/13/2045035.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/05/09/iOS.html</id><title type="text">iOS开发库的族谱介绍</title><summary type="text">Foundation/Core Foundation/Carbon/Cocoa/Cocoa Touch/Toll Free Bridging光看看这tm些名字就jb够晕了，你是不是也看着这些东西恶心？你是不是也发现在你开发同样一个功能的时候，从a库也可以到达，从b库也可以到达？虽然都能抓住老鼠，可是到底哪只猫是串儿？哪只猫是纯种的波斯猫？本文就是对这些库族谱的介绍。 Foundation：Objective-C的核心库。写个Objective-C程序必须包含的库。提供了Objective-C中基本的数据类型和服务。他其实是和Cocoa更加亲密的，按照层次应该和Cocoa是一层。 Core F.</summary><published>2011-05-08T16:01:00Z</published><updated>2011-05-08T16:01:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/05/09/iOS.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/05/09/iOS.html"/><content type="html">&lt;p&gt;Foundation/Core Foundation/Carbon/Cocoa/Cocoa Touch/Toll Free Bridging光看看这tm些名字就jb够晕了，你是不是也看着这些东西恶心？你是不是也发现在你开发同样一个功能的时候，从a库也可以到达，从b库也可以到达？虽然都能抓住老鼠，可是到底哪只猫是串儿？哪只猫是纯种的波斯猫？&lt;/p&gt;&lt;p&gt;本文就是对这些库族谱的介绍。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Foundation：Objective-C的核心库。写个Objective-C程序必须包含的库。提供了Objective-C中基本的数据类型和服务。他其实是和Cocoa更加亲密的，按照层次应该和Cocoa是一层。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Core Foundation: 一个接近系统的C库， 让调用方可以方便的访问系统级的内容。Foundation和Cocoa有其部分功能的封装，这就是为什么完成同一件事有多种解决方案的起源。个人感觉这个比Foundation功能更强大，毕竟更贴近底层自然效率会高一些吧。而且后面会提到，Foundation为了更好的调用Core Foundation，还得和Toll Free Bridging交互。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Carbon：这个跟iOS关系不大，在早期的Mac OS（X之前）必须用这个，提供了一些图形库和很多框架。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Cocoa：这个是现在Mac OS X中才出现的新玩意， 和Carbon一块在Mac OS X上出现。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Cocoa Touch：是Cocoa在iOS上对应的库，做了很多在移动平台上的优化，比如把GC优化没了，因为高效的GC是不符合移动平台的风格的（因为用的是标记法，所以产生的内存碎片无法应对所有移动开发情况）。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Toll Free Bridging：从名字可以看出是啥东西Bridge嘛，给Foundation和Core Foundation中间架个桥，以便调用。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;附上个图以便理解：&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/biosli/%E6%9C%AA%E5%91%BD%E5%90%8D.png" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以上有道听途说，有个人理解。欢迎大家指正。&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2040725.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/05/09/iOS.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/04/30/Mixing_ObjectiveC_and_Cplusplus_in_iPhone_Development.html</id><title type="text">iPhone开发中，在XCode下混合编译C++/Objective-C</title><summary type="text">本文简述了在iPhone开发中需要用到的混合编译Objective-C和C++的方法，并提供了示例。</summary><published>2011-04-29T19:34:00Z</published><updated>2011-04-29T19:34:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/04/30/Mixing_ObjectiveC_and_Cplusplus_in_iPhone_Development.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/04/30/Mixing_ObjectiveC_and_Cplusplus_in_iPhone_Development.html"/><content type="html">&lt;p&gt;先说题外话，文章标题其实起的不好，在iOS的开发中，Apple建立的库基本都是用Objective-C写的，所以在这里的C++指的其实是Objective-C++。&lt;/p&gt;&lt;p&gt;首先，最最最要紧的事情，不是代码而是编译器选项，在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++。&lt;/p&gt;&lt;p&gt;默认的选项是According to file type，用这个的话，你后面每个不在交叉行列里的类都OK，一旦两种语言在一个文件中相互调用，就会报错，而且报的错怪的很，比如：找不到new，找不到delete，等等。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;既然是调用嘛，肯定要有来有往，先说说，在C++中如何调用Objective-C：（&lt;a href="http://stackoverflow.com/questions/1061005/calling-objective-c-method-from-c-method"&gt;参考这个，我略做修改&lt;/a&gt;） &lt;br /&gt;&lt;/p&gt;1. 封装Objective-C的对象函数变为C的函数接口&lt;br /&gt;&lt;p&gt;2. 写一个对应的C++类调用&lt;/p&gt;&lt;p&gt;说起来简单，看看例子就知道什么情况了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;MyObject-C-Interface.h&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#ifndef&amp;nbsp;__MYOBJECT_C_INTERFACE_H__&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__MYOBJECT_C_INTERFACE_H__&amp;nbsp;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectDoSomethingWith&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;myObjectInstance,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;parameter);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;MyObject.h&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MyObject-C-Interface.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;@interface&amp;nbsp;MyObject&amp;nbsp;:&amp;nbsp;NSObject&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;someVar;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;doSomethingWith:(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;aParameter;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;MyObject.m&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MyObject.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectDoSomethingWith&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;self,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;aParameter)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;[(id)&amp;nbsp;self&amp;nbsp;doSomethingWith:aParameter];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@implementation&amp;nbsp;MyObject&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;doSomethingWith:(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;aParameter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;...&amp;nbsp;some&amp;nbsp;code&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;MyCPPClass.h&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;#ifndef&amp;nbsp;__MYCPPCLASS_H__&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__MYCPPCLASS_H__&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyCppClass&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyCPPClass::someMethod&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;objectiveCObject,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;aParameter);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;MyCPPClass.cpp&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MyCPPClass.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;MyObject-C-Interface.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyCPPClass::someMethod&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;objectiveCObject,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;aParameter)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyObjectDoSomethingWith&amp;nbsp;(objectiveCObject,&amp;nbsp;aParameter);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如上面所示，先搞个弱类型的C函数接口，然后在Objective C的类中实现该接口。最后，在C++的类中调用弱类型，和弱接口。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在工程主体框架是用Objective-C写成的前提下，上面的这种调用并不实用，完全是技术可能性的研究。说白了，就是骗骗编译器玩，同时也失去了C++优雅的强类型特性。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下面这个才是真金白银有用的，在Objective-C代码下调用C++类代码：&lt;/p&gt;&lt;p&gt;1. 建立一个C++类&lt;/p&gt;&lt;p&gt;2. 写一个Adaptor的Objective-C类&lt;/p&gt;&lt;p&gt;3. 在其他Objective-C的逻辑中调用Adaptor类。&lt;/p&gt;&lt;p&gt;还是代码：）&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;CPlusPlusClass.h&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;MixCompileTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;biosli&amp;nbsp;on&amp;nbsp;11-4-30.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#ifndef&amp;nbsp;__CPLUSPLUS_CLASS_H__&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__CPLUSPLUS_CLASS_H__&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CPlusPlusClass&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CPlusPlusClass();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;CPlusPlusClass();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;func();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;setInt&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;m_i;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;CPlusPlusClass.mm&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;MixCompileTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;biosli&amp;nbsp;on&amp;nbsp;11-4-30.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CPlusPlusClass.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;CPlusPlusClass::CPlusPlusClass()&amp;nbsp;:&amp;nbsp;m_i(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CPlusPlusClass::CPlusPlusClass()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;func();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CPlusPlusClass::&lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;CPlusPlusClass()&amp;nbsp;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CPlusPlusClass::~CPlusPlusClass()\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CPlusPlusClass::func()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CPlusPlusClass&amp;nbsp;func&amp;nbsp;print:&amp;nbsp;%d\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;m_i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;ObjectiveCAdaptor.h&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;MixCompileTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;biosli&amp;nbsp;on&amp;nbsp;11-4-30.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Foundation&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Foundation.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CPlusPlusClass;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这个声明得小心，千万不要写成@class，兄弟我搞了半宿才找到这个错误。呵呵，见笑，见笑。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;@interface&amp;nbsp;ObjectiveCAdaptor&amp;nbsp;:&amp;nbsp;NSObject&amp;nbsp;{&lt;br /&gt;@private&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CPlusPlusClass&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;testObj;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;objectiveFunc;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;ObjectiveCAdaptor.m&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;MixCompileTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;biosli&amp;nbsp;on&amp;nbsp;11-4-30.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ObjectiveCAdaptor.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CPlusPlusClass.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;@implementation&amp;nbsp;ObjectiveCAdaptor&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(id)&amp;nbsp;init&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(self&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;[super&amp;nbsp;init])&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testObj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CPlusPlusClass();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;dealloc&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(testObj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NULL)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;testObj;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testObj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[super&amp;nbsp;dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;objectiveFunc&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testObj&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;setInt(&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testObj&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;func();&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用示例：&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;callObjectiveCAdaptorMethod&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ObjectiveCAdaptor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;testObjectiveCObj&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;[[ObjectiveCAdaptor&amp;nbsp;alloc]&amp;nbsp;init];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[testObjectiveCObj&amp;nbsp;objectiveFunc];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[testObjectiveCObj&amp;nbsp;release];&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面这个例子演示了创建C++类，创建&lt;span style="color: #008000;"&gt;&lt;/span&gt;Objective-C的Adaptor类，和最后调用的全过程。&lt;/p&gt;&lt;p&gt;&lt;span style="color: red;"&gt;在编写混合编译代码时一定要记住一个原则，Objective-C++这个东东包含了Objective-C&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;和C++的所有关键字和符号，所以在编写交叉编译代码时，千万不要用混本来就很像的关键字和符号。&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;参考资料： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;具体的代码限制：请参考&lt;a href="http://hi.baidu.com/184367426/blog/item/4324263a5ac76e2f71cf6c7c.html"&gt;《Objective-C和C++混编的要点》&lt;/a&gt;&lt;/p&gt;&lt;p&gt;混合编译好处多，这篇文章叙述的相当到位&lt;a href="http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects"&gt;《Strategies for Using C++ in Objective-C Projects》&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2033247.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/04/30/Mixing_ObjectiveC_and_Cplusplus_in_iPhone_Development.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/04/22/2025224.html</id><title type="text">iphone下scrollview图片浏览器小记</title><summary type="text">本文介绍了利用UIScrollView制作图片浏览器的概要和注意事项。及作者对iOS开发的思考。</summary><published>2011-04-22T11:31:00Z</published><updated>2011-04-22T11:31:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/04/22/2025224.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/04/22/2025224.html"/><content type="html">&lt;p&gt;今天看书中介绍了从图片库中调用图片的例子，一时性起打算做一个简单的图片浏览器。&lt;/p&gt;&lt;p&gt;功能很简单，从图片库中载入图片，然后放到view下，并支持放大，缩小，平移。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;由于对控件库不了解，一开始的方案是这样的：&lt;/p&gt;&lt;p&gt;前面的框架都一样： &lt;br /&gt;&lt;/p&gt;&lt;p&gt;用toolbar做按钮条，里面有个按键，触发从按键。&lt;/p&gt;&lt;p&gt;按键action调用图片库，之后图片库发消息到delegate(我这里协议挂在了主UIViewController上面，后面其他的delegate也一样)。&lt;/p&gt;&lt;p&gt;如果正确得到了图片 UIImagePickerControllerDelegate的imagePickerController:didFinishPickingMediaWithInfo:的第二个参数可以得到一个包含选定图片的Dictionary。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;OK，演出开始了。后面的方案是这样。&lt;/p&gt;&lt;p&gt;1.　　搞了个UIImageView作为图片载体，扑满整个屏幕，然后将Mode设置为Center，图片设置后可以居中显示。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;然后利用UIPinchGestureRecognizer做手势，手势触发后会回调响应方法。在方法中设置UIImageView的bounds和center保证其居中显示。过程中从网络上搜索了一个扩展UIImage的类型，可以进行缩放图片。源码：(&lt;span style="color: red;"&gt;注意，这个函数由于用到了&lt;/span&gt;&lt;span style="color: red;"&gt;UIGraphicsXXXX函数，要求只能再主线程中调用&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;UIImage_Extra.h&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Camera&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;李&amp;nbsp;择一&amp;nbsp;on&amp;nbsp;11-4-22.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Foundation&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Foundation.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@interface&amp;nbsp;UIImage&amp;nbsp;(Extra)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(UIImage&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;imageByScalingAndCroppingForSize:&amp;nbsp;(CGSize)targetSize;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;UIImage_Extra.m&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Camera&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Created&amp;nbsp;by&amp;nbsp;李&amp;nbsp;择一&amp;nbsp;on&amp;nbsp;11-4-22.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;Copyright&amp;nbsp;2011&amp;nbsp;__MyCompanyName__.&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#import&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UIImage_Extra.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation&amp;nbsp;UIImage&amp;nbsp;(Extra)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(UIImage&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)imageByScalingAndCroppingForSize:&amp;nbsp;(CGSize)targetSize&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;sourceImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;self;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;newImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;nil;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGSize&amp;nbsp;imageSize&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sourceImage.size;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;width&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;imageSize.width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;height&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;imageSize.height;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;targetWidth&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetSize.width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;targetHeight&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetSize.height;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;scaleFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;scaledWidth&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;scaledHeight&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetHeight;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGPoint&amp;nbsp;thumbnailPoint&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CGPointMake(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(CGSizeEqualToSize(imageSize,&amp;nbsp;targetSize)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;NO)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;widthFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetWidth&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGFloat&amp;nbsp;heightFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;targetHeight&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;height;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(widthFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;heightFactor)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scaleFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;widthFactor;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;scale&amp;nbsp;to&amp;nbsp;fit&amp;nbsp;height&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scaleFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;heightFactor;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;scale&amp;nbsp;to&amp;nbsp;fit&amp;nbsp;width&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scaledWidth&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;width&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaleFactor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scaledHeight&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;height&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaleFactor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;center&amp;nbsp;the&amp;nbsp;image&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(widthFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;heightFactor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thumbnailPoint.y&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(targetHeight&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaledHeight)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(widthFactor&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;heightFactor)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thumbnailPoint.x&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(targetWidth&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaledWidth)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIGraphicsBeginImageContext(targetSize);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;this&amp;nbsp;will&amp;nbsp;crop&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CGRect&amp;nbsp;thumbnailRect&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CGRectZero;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thumbnailRect.origin&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;thumbnailPoint;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thumbnailRect.size.width&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaledWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thumbnailRect.size.height&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;scaledHeight;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[sourceImage&amp;nbsp;drawInRect:thumbnailRect];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;UIGraphicsGetImageFromCurrentImageContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(newImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;nil)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NSLog(&lt;/span&gt;&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;could&amp;nbsp;not&amp;nbsp;scale&amp;nbsp;image&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pop&amp;nbsp;the&amp;nbsp;context&amp;nbsp;to&amp;nbsp;get&amp;nbsp;back&amp;nbsp;to&amp;nbsp;the&amp;nbsp;default&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIGraphicsEndImageContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;newImage;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;再往下做平移的时候出现了问题，虽然可以重载touchesBegan和touchesMove移动UIImageView，可是就失去了iOS特效了，并且当图片移到屏幕边缘再进行放大，缩小，UIImageView就不一定飞到那里去了，还需要继续增加判断条件。所以此方法不可取。&lt;/p&gt;&lt;p&gt;------------------------------2011-04-25 更新------------------------------&lt;br /&gt;&lt;/p&gt;&lt;p&gt;现在发现了新的api可以解决拉伸的问题。在UIImage 中有个函数叫stretchableImageWithLeftCapWidth:topCapHeight:的，可以返回一个新的UIImage，这个UIImage是可以拉伸的。具体用法请参阅apple的Sample Code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------- &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2.　　到网上查了可以利用UIScrollView做平移处理，在其中嵌入一个UIImageView，手势用来管理图片放大缩小，这样就可以一边吃火锅，一边唱歌了。&lt;/p&gt;&lt;p&gt;这个方案要考虑的事情有几个，一个是UIScrollView的contentSize的要考虑UIImageView的大小，在放大或者缩小图片以后要调整contentSize的大小。&lt;/p&gt;&lt;p&gt;还有一个就是在缩放的时候要考虑到，缩放的中心位置问题。比如，现在图片上有个人脸，然后手势是以人脸鼻子为中心放大的，在放大结束后，可能手势的中心就跑偏了，因此要在缩放时修改UIImageView的center，这个计算还是挺复杂的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3.　　为了解决这个问题继续搜索文档，发现在UIScrollView里面有zoom这个东东，可以通过delegate的viewForZoomingInScrollView:方法指定UIScrollView中的某个view放大，还可以设定放大的最大倍数和最小倍数。这个nb了，一个UIScrollView类全都搞定了平移缩放。酷啊！！&lt;/p&gt;&lt;p&gt;但是这个也有要注意的问题。由于UIScrollView里面可能要主动调用他所包含subView的属性，因此在缩放过程中，不要修改subview的属性。&lt;/p&gt;&lt;p&gt;另外，缩放平移全都人家搞了，在给UIImageView中换图片之前一定要注意先将UIScrollView的zoomScale，contentSize，contentOffset全都设置成初始值。设想这样一个情况，在UIScrollView里面将图片放大，contentSize，contentOffset，zoomScale全变了，而你这时候找了个特小的图片放进来，如果不设置那三个属性的初值，或者只设置了一个，这样必然会造成混乱。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;三种方法里还是第三种最简单啊。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;总结：我忘了那本书里面说过，Apple公司为在Mac上面的工作做了20年，如果你需要用很多代码实现一个很简单的功能，肯定是方法不对。 &lt;/p&gt;&lt;p&gt;今天的探索印证了这句话。还有，现在市面上所有的iOS开发书籍里都没有原理层面的讲解开发的。所以搜索引擎，加上浏览各种网站论坛成为解决问题的快捷途径。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;不知道什么时候能出一本《深入理解iOS开发模型》之类的书啊！！&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2025224.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/04/22/2025224.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/04/17/2018644.html</id><title type="text">XCode生成调用静态链接库</title><summary type="text">今天尝试将静态链接库引入工程：Objective-C的试验成功！！建立一个Cocoa Touch库工程，然后写代码操文件，编译出来。将在建立一个Client工程，这个工程是app工程，由这个可以引用刚才的那个库工程，将库工程生成的.a加到Target的link下（使静态库可被引用），然后进入&amp;quot;Get Info&amp;quot;-&amp;gt;&amp;quot;Generat&amp;quot;关联依赖项（在工程下可以交叉编译），再将头文件地址加入Header Search里面。这样就可以用了。另外，那个SBJSON库完成了上述操作后还要修改&amp;quot;Other linker flags&amp;quot;为“-Ob</summary><published>2011-04-16T18:59:00Z</published><updated>2011-04-16T18:59:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/04/17/2018644.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/04/17/2018644.html"/><content type="html">今天尝试将静态链接库引入工程：&lt;br /&gt;Objective-C的试验成功！！&lt;br /&gt;建立一个Cocoa Touch库工程，然后写代码操文件，编译出来。&lt;br /&gt;将在建立一个Client工程，这个工程是app工程，由这个可以引用刚才的那个库工程，将库工程生成的.a加到Target的link下（使静态库可被引用），然后进入"Get Info"-&amp;gt;"Generat"关联依赖项（在工程下可以交叉编译），再将头文件地址加入Header Search里面。&lt;br /&gt;&lt;p&gt;这样就可以用了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;另外，那个SBJSON库完成了上述操作后还要修改"Other linker flags"为&amp;#8220;-ObjC&amp;#8221; 和&amp;#8220; -all_load&amp;#8221;（妈的，搞了我半宿才找到，现在语无伦次，还好下面有具体的介绍文章）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;有一篇好的介绍文章，介绍的很详细：&lt;br /&gt;&#xD;
http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/2018644.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/04/17/2018644.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/03/19/1989120.html</id><title type="text">Windows Phone 7 学习流程攻略（三）</title><summary type="text">今天介绍触摸屏点击 从硬件设计上说Windows Phone 7至少可以接收4个手指的触摸事件。  一、在XNA上的Low-Level触摸事件 可以利用全局的TouchPanel class来的到输入事件。 ----------------------------- Tips: 1. 调用静态的TouchPanel.GetCapabilities()方法返回TouchPanelCapabiliti...</summary><published>2011-03-19T14:44:00Z</published><updated>2011-03-19T14:44:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/03/19/1989120.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/03/19/1989120.html"/><content type="html">&lt;p&gt;今天介绍触摸屏点击&lt;/p&gt;  &lt;p&gt;从硬件设计上说Windows Phone 7至少可以接收4个手指的触摸事件。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;一、在XNA上的Low-Level触摸事件&lt;/p&gt;  &lt;p&gt;可以利用全局的TouchPanel class来的到输入事件。&lt;/p&gt;  &lt;p&gt;-----------------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 调用静态的TouchPanel.GetCapabilities()方法返回TouchPanelCapabilities的可以的到系统的输入能力。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; TouchPanelCapabilities对象中:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IsConnected表示触摸是否可用。 &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MaximumTouchCount表示最多可响应几个触点。&lt;/p&gt;  &lt;p&gt;2. 在Update()函数中，调用TouchPanel.GetState()方法来的到TouchCollection对象来的到当前的按键情况。&lt;/p&gt;  &lt;p&gt;3. 得到的TouchCollection对象中有0到多个TouchLocation对象，包含单个触点对象的信息。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; TouchLocation对象中：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TouchLocationState State：Pressed, Moved, Released&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Vector2 Position：表示触点针对左上角的位置&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int id：表示在一次触摸过程中的唯一标识（从按下开始分配这个ID，在抬起事件结束前这个ID不会变）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool TryGetPreviousLocation(out TouchLocation)方法，可以得到上一次刷新的触点对象。（可以用来算位移差值，没有上一个位置的话函数会返回false）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 注意：在Pressed事件过后，就算手指没有移动也会接收到Moved事件，直到手指抬起触发Released事件。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 如果点击得特别快在两次刷新之间完成了按下和抬起，是收不到Moved事件的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 手指这个东东比较粗，有可能你按一下下会产生多个Pressed事件，处理的时候还要考虑按键区域的问题。不要重复计算多个区域的好。&lt;/p&gt;  &lt;p&gt;------------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;二、XNA下的手势接口&lt;/p&gt;  &lt;p&gt;这个比刚才那个高级了。&lt;/p&gt;  &lt;p&gt;直接利用TouchPanel.EnabledGestures设置你需要监听的手势，然后在Update()中，通过查询属性TouchPanel.IsGestureAvailable，得到当前是否有需要的手势状态并做处理。&lt;/p&gt;  &lt;p&gt;------------------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. TouchPanel.EnabledGestures可以设置的动作有Tap, DoubleTap, Flick, Hold, Pinch, PinchComplete, FreeDrag, HorizontalDrag, VerticalDrag 和 DragComplete，他们之间可以用与运算连接同时设置多个动作。&lt;/p&gt;  &lt;p&gt;2. 在Update()中读取手势的方法：&lt;/p&gt;  &lt;p&gt;protected override void Update(GameTime gameTime)    &lt;br /&gt;{&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; while(TouchPanel.IsGestureAvailable)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //得到一个动作取样&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GestureSample gestureSample = TouchPanel.ReadGesture();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (gestureSample.GestureType == GestureType.Tap)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //…………………………&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else if (gestureSample.GestureType == ……….)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //…………………………&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 注意：手势事件是在确实触发了这种事件后才执行的，因此Tap是在手指离开屏幕才处理的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 有些手势会有前置动作，GestureSample中的Position2和Delta2就起了作用。&lt;/p&gt;  &lt;p&gt;----------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;三、在Silverlight上的Low-Level触摸事件&lt;/p&gt;  &lt;p&gt;在Silverlight上，可以通过静态事件Touch.FrameReported回调事件响应函数。&lt;/p&gt;  &lt;p&gt;--------------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 将回调函数添加到事件中。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Touch.FrameReported += OnTouchFrameReported;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 回调函数的实现类似于：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void OnTouchFrameReported(object sender, TouchFrameEventArgs args) {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; … &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TouchFrameEventArgs对象中包含：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetTouchPoints(refElement) 返回一个 TouchPointCollection（也就是一组TouchPoint，参数传null的话，返回从左上角开始的所有触点内容）    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetPrimaryTouchPoint(refElement) 返回一个 TouchPoint（第一个触摸事件）     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SuspendMousePromotionUntilTouchUp()禁止该事件被提升为鼠标事件，这个函数可有渊源等下详细介绍。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetTouchPoints和GetPrimaryTouchPoint返回的都是和TouchPoint相关的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 那就先说说TouchPoint对象：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TouchAction Action：Down, Move, 和 Up.&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Point Position：这个就是针对左上角的坐标了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Size Size：触摸的区域大小（在WP7上没啥用）&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TouchDeivce TouchDeivce：这个是个对象里面包含：int Id，从触点按下到抬起的唯一标识。UIElement DirectlyOver，按键底下的控件，也就是谁不幸被点了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SuspendMousePromotionUntilTouchUp()，禁止该时间被提升为鼠标事件，得解释一下，这个方法来自桌面的Silverlight，很多桌面程序只有鼠标按键，现在有触摸屏了，点一下触摸屏，一小下，就不好区分，这个事件是鼠标点的还是触控事件呢？这个函数就是在处理触控的时候防止同时触发鼠标的点击事件。因此，这个函数只能在，只有在处理第一个触摸事件，并且是在处理按下事件的时候才能调用。否则~~哼哼，会抛出异常。下面是个调用的例子。&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;void OnTouchFrameReported(object sender, TouchFrameEventArgs args) &lt;/p&gt;    &lt;p&gt;{&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TouchPoint primaryTouchPoint = args.GetPrimaryTouchPoint(null); &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //第一个触点，并且是按下事件      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (primaryTouchPoint != null &amp;amp;&amp;amp; primaryTouchPoint.Action == TouchAction.Down)&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; args.SuspendMousePromotionUntilTouchUp();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; … &lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;-----------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;四、操作事件（The Manipulation Events）&lt;/p&gt;  &lt;p&gt;Silverlight的高级操作接口。由三个事件组成ManipulationStart、ManipulationDelta、MannipulationCompleted。&lt;/p&gt;  &lt;p&gt;-----------------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 在xaml中，这三个事件可以作为控件的属性添加到控件中。&lt;/p&gt;  &lt;p&gt;2. 三个方法ManipulationStart、ManipulationDelta、ManipulationCompleted，分别对应触摸操作的按下，移动，抬起三个事件。并且在出发ManipulationStart事件到ManipulationCompleted结束之间，就算有其他触摸，事件也不会被响应。&lt;/p&gt;  &lt;p&gt;3. 在回调中调用args.Complete()方法，会在执行完当前回调后立即触发ManipulationCompleted这个事件。&lt;/p&gt;  &lt;p&gt;4. 继承PhoneApplicationPage的窗口可以重载ManipulationStart、ManipulationDelta、ManipulationCompleted这三个方法。注意到在参数对象ManipulationStartedEventArgs args中，args.OriginalSource标志的是页面上触摸的控件。&lt;/p&gt;  &lt;p&gt;----------------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;五、操作事件的执行路径&lt;/p&gt;  &lt;p&gt;现在，控件上可以有三个操作的回调，页面上可以有三个操作的重载。他们的执行路径会是什么样的呢？&lt;/p&gt;  &lt;p&gt;场景：&lt;/p&gt;  &lt;p&gt;在Page上有一个TextBlock，现在用户在TextBlock点了一下。&lt;/p&gt;  &lt;p&gt;以ManipulationStart事件为例：Silverlight框架会先执行TextBlock上的回调，然后执行Page重载的方法。&lt;/p&gt;  &lt;p&gt;但是当执行TextBlock上的回调时，设置了args.Handled为true，这样消息就不会传递给上层Page了。&lt;/p&gt;  &lt;p&gt;延伸：&lt;/p&gt;  &lt;p&gt;有个比较有意思的事情，TextBlock上的ManipulationStart执行时执行了args.Complete()，并且设置了args.Handled为true，同时不对ManipulationComplete中的args做操作。上层Page收不到OnManipulationStart的事件了，可是可以执行OnManipulationComplete重载。结论是这三个事件之间是并行没有关联的。&lt;/p&gt;  &lt;p&gt;其实也好理解，分别实现三个事件比三个事件关联容易多了，框架也更整齐。写Silverlight的人也是参考了一些游戏框架的消息处理机制的。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/1989120.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/03/19/1989120.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/03/15/1984359.html</id><title type="text">Windows Phone 7 学习流程攻略（二）</title><summary type="text">今天介绍，本教程的第二章。 第二章 手机方向 一，Silverlight和自动布局 在xaml中可以通过，SupportedOrientations来设置程序中支持的手机方向。 在切换手机方向后，Silverlight会自动根据xaml中的设置重新布局，所以在设计时要考虑屏幕方向改变后程序的切换效果。 书中利用TextBlock中的VerticalAlignment和HorizontalAlign...</summary><published>2011-03-14T16:24:00Z</published><updated>2011-03-14T16:24:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/03/15/1984359.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/03/15/1984359.html"/><content type="html">&lt;p&gt;今天介绍，本教程的第二章。&lt;/p&gt;  &lt;p&gt;第二章 手机方向&lt;/p&gt;  &lt;p&gt;一，Silverlight和自动布局&lt;/p&gt;  &lt;p&gt;在xaml中可以通过，SupportedOrientations来设置程序中支持的手机方向。&lt;/p&gt;  &lt;p&gt;在切换手机方向后，Silverlight会自动根据xaml中的设置重新布局，所以在设计时要考虑屏幕方向改变后程序的切换效果。&lt;/p&gt;  &lt;p&gt;书中利用TextBlock中的VerticalAlignment和HorizontalAlignment进行了布局演示。&lt;/p&gt;  &lt;p&gt;--------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. VerticalAlignment可设置为Top，Center，Bottom。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; HorizontalAlignment可设置为Left，Center，Right。&lt;/p&gt;  &lt;p&gt;2. Margin属性的类型是Thickness。在xaml中Thickness可以有一个参数（四个方向全都是这个数值），两个参数（左右方向为第一个参数，上下方向为第二个参数），四个参数（不用说了，代表左上右下）&lt;/p&gt;  &lt;p&gt;3. 可以在控件添加SizeChanged属性事件，于cs文件中实现该控件大小改变时需要做的工作。&lt;/p&gt;  &lt;p&gt;4. 在xaml中以命名的标签可以，在cs中调用。命名方式有两种x:Name和Name，书中解释属性x:Name是xmal文件标签的命名方式，而属性Name是继承FrameworkElement的，因此不是所有标签都可以用Name命名。（后面会看见各种TransForm都不是继承FrameworkElement的，因此只能用x:Name命名）&lt;/p&gt;  &lt;p&gt;5. 可以在xaml中修改属性shell:SystemTray.IsVisible来显示或隐藏任务栏。如果用户不需要知道事件，而你需要32个像素的空间时，大可以隐去任务栏。&lt;/p&gt;  &lt;p&gt;-----------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;二，方向改变事件&lt;/p&gt;  &lt;p&gt;Silverlight中，可以在cs文件中重载PhoneApplicationPage的OnOrientationChanged函数来截获屏幕方向发生变化的事件。（当然是在SupportedOrientations允许屏幕方向改变的前提下）参数中的Orientation属性是新的屏幕方向。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;三，XNA中的方向设置&lt;/p&gt;  &lt;p&gt;XNA中默认的是Landscape方向，不过在Game1()构造函数构造了graphics之后，可以通过设置他的SupportedOrientations属性来声明允许的屏幕方向。&lt;/p&gt;  &lt;p&gt;---------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 设置许可方向的方法在Game1()，构造graphics对象后调用&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;graphics.SupportedOrientations = DisplayOrientation.Portrait |     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayOrientation.LandscapeLeft |      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayOrientation.LandscapeRight;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2. 在屏幕方向是Portrait的时候屏幕的默认大小是240*240，这时可以设置graphics的PreferedBackBufferWidth和PreferedBackBufferHeight来调整屏幕缓冲大小。&lt;/p&gt;  &lt;p&gt;3. graphics.IsFullScreen可以用来设置是否全屏。&lt;/p&gt;  &lt;p&gt;4. 由于XNA中没有提供屏幕方向改变时响应的事件，因此只能在Update函数中实时刷this.GraphicsDevice.Viewport来计算此时屏幕大小，改变XNA内容，刷新画图。&lt;/p&gt;  &lt;p&gt;5. 还可以通过this.Window.ClientBounds得到工作区域的矩形。&lt;/p&gt;  &lt;p&gt;--------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;四，一个简单的时钟实现&lt;/p&gt;  &lt;p&gt;这段介绍了如何分别用Silverlight和XNA来实现一个时钟。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Silverlight比较简单利用System.Windows.Threading的DispatcherTimer建立一个对象。设置步长DispatcherTimer.Interval，添加DispatcherTimer.Tick事件的回调委托，DispatcherTimer.Start开始。&lt;/p&gt;  &lt;p&gt;然后按事件回调一刷界面就可以了。&lt;/p&gt;  &lt;p&gt;这里着重介绍了Silverlight的刷新方法，不是全屏刷，而是只刷改变的控件。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;XNA通过对在Update函数中对时间差的对比来判断是否超过一秒钟，如果超过一秒就刷新文字内容，否则调用SuppressDraw();来取消这次执行完Update后，需要执行的Draw函数。&lt;/p&gt;  &lt;p&gt;-------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 还是由于垃圾回收影响效率的问题，需要在Update中做字符操作的时候，在声明字符串的时候用StringBuilder类代替String类型。&lt;/p&gt;  &lt;p&gt;2. 在Update函数中调用SuppressDraw函数可以取消这次Update后应该执行的Draw函数。这是一个可以减少耗电的好把戏。&lt;/p&gt;  &lt;p&gt;-------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;下一章介绍触摸。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/1984359.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/03/15/1984359.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/biosli/archive/2011/03/14/1983111.html</id><title type="text">Windows Phone 7 学习流水攻略（一）</title><summary type="text">学而不思则罔，思而不学则殆。 从上周开始看Charles Petzold的《Programming Windows Phone 7》。书中的内容颇为丰富，受益匪浅。 但也因为书中涵盖内容太多，需要做的笔记也很多，所以索性写博客按章节把内容总结出来。 目的有两个： 第一，对所学知识做一个总结。 第二，便于以后按章节查找具体内容，毕竟书是英文版，如果要找相应内容面对长得差不多的英文还是要翻一阵的。  ...</summary><published>2011-03-13T16:53:00Z</published><updated>2011-03-13T16:53:00Z</updated><author><name>摇滚诗人</name><uri>http://www.cnblogs.com/biosli/</uri></author><link rel="alternate" href="http://www.cnblogs.com/biosli/archive/2011/03/14/1983111.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/biosli/archive/2011/03/14/1983111.html"/><content type="html">&lt;p&gt;学而不思则罔，思而不学则殆。&lt;/p&gt;  &lt;p&gt;从上周开始看Charles Petzold的《Programming Windows Phone 7》。书中的内容颇为丰富，受益匪浅。&lt;/p&gt;  &lt;p&gt;但也因为书中涵盖内容太多，需要做的笔记也很多，所以索性写博客按章节把内容总结出来。&lt;/p&gt;  &lt;p&gt;目的有两个：&lt;/p&gt;  &lt;p&gt;第一，对所学知识做一个总结。&lt;/p&gt;  &lt;p&gt;第二，便于以后按章节查找具体内容，毕竟书是英文版，如果要找相应内容面对长得差不多的英文还是要翻一阵的。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;好了，从前言开始吧！&lt;/p&gt;  &lt;p&gt;前言，大体介绍了安装开发环境需求（Windows 7系统，VS2010），书中的内容，一些资源的索引，本书针对的人群（对C#和.NET有经验）等。&lt;/p&gt;  &lt;p&gt;其中作者针对那些没有学习过C#和.Net的C++程序员（like me），推荐了他的一本书&lt;a href="http://www.charlespetzold.com/dotnet/" target="_blank"&gt;《.NET第0章:C或C++程序员必须知道的C#和.NET Framework》&lt;/a&gt;(.NET Book Zero: What the C or C++ Programmer Needs to Know about C# and the .NET Framework)，我还真是好好看了一遍他推荐的这本书，从C/C++的程序员角度入手解释C#和.NET，算是启蒙书。&lt;/p&gt;  &lt;p&gt;书分三个部分：第一部分（1-6章）介绍Silverlight和XNA的共同部分，第二（7-18章）、第三（19-23章）部分分别介绍Silverlight和XNA下的开发。&lt;/p&gt;  &lt;p&gt;（国外的朋友写书喜欢留伏笔，前面大概说说，后面扩展，所以有些章节只是知识的索引大头在后面，中间的跨度可能有好几章）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;第一章，Hello, Windows Phone 7。&lt;/p&gt;  &lt;p&gt;一，介绍Silverlight和XNA上两个框架的异同。&lt;/p&gt;  &lt;p&gt;Silverlight偏流程，由事件触发流程。XNA偏游戏开发，主要是玩循环的。&lt;/p&gt;  &lt;p&gt;个人理解，XNA就是类似于纯的Windows API开发，当然也封装过了，为了省你的事给你架了一套处理图像处理机制。不然双缓冲，事件处理啥的就还得你做。&lt;/p&gt;  &lt;p&gt;Silverlight就是高级版的MFC（其实更像Flash），利用XAML布局，C#写后台。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;二，介绍硬件按键&lt;/p&gt;  &lt;p&gt;告诉你屏幕上那几个难看的按键都是干嘛用的。在后面的开发中，你会发现其实这几个按键具体触发的事件等。&lt;/p&gt;  &lt;p&gt;还有告诉你现在手机有可能出现的分辨率会是啥样的。另外告诉你屏幕的特性——屏幕Theme颜色越暗越省电。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;三，介绍硬件传感器和服务&lt;/p&gt;  &lt;p&gt;什么Wifi，摄像头，加速度传感器，位置服务（GPS），FM收音机，Push同步（Push Notifications，减少网络交互用的，必要时才做连接的服务）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;四，破处之旅&lt;/p&gt;  &lt;p&gt;告诉你VS里面怎么找到建立工程的入口。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;五，第一次和Silverlight搞&lt;/p&gt;  &lt;p&gt;告诉你怎么改程序标题，怎么运行（调试）程序，怎么在模拟器上玩的爽（调整模拟器屏幕大小）。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;六，一个Silverlight程序中包含的基本文件&lt;/p&gt;  &lt;p&gt;两对配对的开发文件:&lt;/p&gt;  &lt;p&gt;App.xaml和App.xmal.cs&lt;/p&gt;  &lt;p&gt;还有&lt;/p&gt;  &lt;p&gt;Main.xaml和Main.xmal.cs&lt;/p&gt;  &lt;p&gt;.xmal是前台文件.cs是对应的后台文件。&lt;/p&gt;  &lt;p&gt;App那一对是程序运行的入口文件和全局的配置文件。&lt;/p&gt;  &lt;p&gt;Main那一对是第一“夜”的服务内容。&lt;/p&gt;  &lt;p&gt;其中说到xaml生成的中间文件.g.cs（其实也是个cs文件）在obj/Debug目录下，这个文件可了不起了，是你xaml编译后生成的cs文件，其中包含了你在.cs文件中用到的变量声明。然后，利用了C#可以利用Partial将类份文件编译的语言特性，将声明和.cs文件揉起来。但是这个文件是自动生成的，不要做修改，因为如果你修改了下次重编的时候还会变回去，要是想修改就看看你的xaml文件有没写错吧！！&lt;/p&gt;  &lt;p&gt;接着，分别介绍了xaml基本标签的含义，如&amp;lt;phone:PhoneApplicationPage ….&amp;gt;，&amp;lt;Grid…&amp;gt;，&amp;lt;TextBlock…&amp;gt;等等&lt;/p&gt;  &lt;p&gt;最后告诉你怎么通过修改xaml改标题和添加一个TextBlock，并且介绍了TextBlock的HorizontalAlignment和VerticalAlignment属性。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;七，颜色主题&lt;/p&gt;  &lt;p&gt;介绍如何换主题，还有通过TextBlock的Foreground属性变换字体颜色。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;八，教你怎么算字体大小和字体的实际大小&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;九，告诉你WP7程序打包的秘密&lt;/p&gt;  &lt;p&gt;XAP程序包文件其实是个zip文件，你把后缀xap文件改成后缀zip，可以用Winzip打开查看其中的资源。&lt;/p&gt;  &lt;p&gt;我发现资源是散着的，而程序是个dll。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;十，第一个XNA程序&lt;/p&gt;  &lt;p&gt;一个新的XNA工程的结构：一个新开的XNA项目，有两个工程，一个是资源工程，一个是逻辑工程。&lt;/p&gt;  &lt;p&gt;介绍了如何向资源工程里添加字体，如何编辑SpriteFont文件，里面的标签是干啥的，如：FoneName,Size,CharacterRegions等等。&lt;/p&gt;  &lt;p&gt;介绍了在逻辑工程Game1.cs文件中添加一个自定义字体的方法：&lt;/p&gt;  &lt;p&gt;要建立N个变量……&lt;/p&gt;  &lt;p&gt;在Game1()构造函数里生成对象,&lt;/p&gt;  &lt;p&gt;运行Initialize()函数初始化，&lt;/p&gt;  &lt;p&gt;在LoadContent()载入字体资源（如果有可能在这里做画图的初始化工作，计算坐标等，因为在这里载入字体资源后才能得到字体的大小，才能够算出字符串所占像素数。）&lt;/p&gt;  &lt;p&gt;-----------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. this.Content.Load&amp;lt;SpriteFont&amp;gt;(“spriteFontName”)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Content是ContentManager的引用，用于Load资源。&lt;/p&gt;  &lt;p&gt;2. Vector2 SpriteFont.MeatureString(string str)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 可以得到字符串像素大小。&lt;/p&gt;  &lt;p&gt;3. this.GraphicsDevice.Viewport&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 可以得到屏幕可操作的区域大小，及起始点（0,0），另外屏幕左上角是（0,0）点&lt;/p&gt;  &lt;p&gt;-----------------&lt;/p&gt;  &lt;p&gt;然后程序会运行Update，Draw，Update，Draw…两个函数循环执行。&lt;/p&gt;  &lt;p&gt;因此在Update的时候做逻辑运算，在Draw的时候画图。&lt;/p&gt;  &lt;p&gt;------------------&lt;/p&gt;  &lt;p&gt;Tips:&lt;/p&gt;  &lt;p&gt;1. 由于垃圾回收会占用资源，影响效率，因此在XNA程序中struct会被更频繁的用到（C#中sruct是栈分配内存且做内存拷贝）&lt;/p&gt;  &lt;p&gt;2. 处于对第一点的考虑，在Update函数中尽量不要调用new来在堆上构造class.&lt;/p&gt;  &lt;p&gt;3. Draw的时候利用SpriteBatch做画图操作。具体的画图语句应该包含在SpriteBatch.Begin()和SpriteBatch.End()之间&lt;/p&gt;  &lt;p&gt;如：&lt;/p&gt;  &lt;p&gt;protected override void Draw(GameTime gameTime)   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; GraphicsDevice.Clear(Color.Navy);&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; spriteBatch.Begin();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; spriteBatch.DrawString(segoe14, text, textPosition, Color.White);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; spriteBatch.End();&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; base.Draw(gameTime);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;------------------&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最后，作者为下一章做了铺垫。&lt;/p&gt;  &lt;p&gt;在Silverlight中屏幕的默认方向是Portrait，XNA方向是LandscapeRight的。&lt;/p&gt;  &lt;p&gt;下一章将介绍屏幕方向的问题。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/biosli/aggbug/1983111.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/biosli/archive/2011/03/14/1983111.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
