=====================以下iPhone(iOS)开发相关===============================
001) 开发iOS应用软件的相关条件?
0> 基于Intel 的苹果机一台。
1> iPhone SDK 可以从http://developer.apple.com 上下载
主要包括:集成开发环境Xcode,iPhone 模拟器及一些开发工具。
Xcode (主要工具)
Interface Builder (界面设计工具)
iPhone Simulator (iPhone 模拟器)
SDK (Software Development Kit 软件开发工具包)
2> iPhone 开发语言
Objective-C
3> 注册成为一个iPhone 应用开发人员(99$ / Year)
http://developer.apple.com/programs/register/
4> 关于一些iPhone 开发者新闻
iShoot Game (Ethan Nicholas 日收入2万多美金)
Trism Game (Steve Demeter 月收入超过10万美金)
苹果应用商店2010年收入:17亿美金
博看科技公司(创始人汪波),已开发30多款产品在苹果应用商店上热销。
002) 在iPhone 开发中怎么实现动画左右旋转
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:whiteBackdrop cache:YES];
这个属性可以设置动化的旋转方向
代码如下:
- (void) animationFinished: (id) sender
{
self.navigationItem.rightBarButtonItem =[[[UIBarButtonItem alloc] initWithTitle:@"11" style:UIBarButtonItemStylePlain target:self action:@selector(flip:)] autorelease];
}
- (void) flip: (id) sender
{
// 隐藏右侧按钮
self.navigationItem.rightBarButtonItem = nil;
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1.0];
//获取移动的view
UIView *whiteBackdrop = [self.view viewWithTag:100];
// 选择是左移还是右移
if ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex])
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:whiteBackdrop cache:YES];
else
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:whiteBackdrop cache:YES];
NSInteger purple = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:999]];
NSInteger maroon = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:998]];
[whiteBackdrop exchangeSubviewAtIndex:purple withSubviewAtIndex:maroon];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
[UIView commitAnimations];
}
- (void)loadView
{
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"11" style:UIBarButtonItemStylePlain target:self action:@selector(flip:)] autorelease]; //BARBUTTON(@"Flip",);
// 设置分段控件 标题
UISegmentedControl *seg = [[[UISegmentedControl alloc] initWithItems:[@"左转 右转" componentsSeparatedByString:@" "]] autorelease];
seg.selectedSegmentIndex = 0;
seg.segmentedControlStyle = UISegmentedControlStyleBar;
self.navigationItem.titleView = seg;
//设置转向的view
UIView *view100=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320, 480)];
view100.tag=100;
view100.backgroundColor=[UIColor blueColor];
self.view=view100;
}
003) iPhone 开发之使用Sqlite 的注意事项总结
1.使用Sqlite需要添加框架集libsqlite3.dylib以及import头文件。
2.Sqlite函数库是使用c开发的,所以SQL查询语句需要使用char*保存,NSString转Char*请使用[NSString UTF8String]。
3.使用Sqlite查询某字段含某关键字的SQL语句写法是"select * from tb_table where title like '%hello%';",其中hello是要查询的关键字,SQL语句后有分号。
4.百分号的转换,NSString中需要格式化的字符串中百分号使用%%表示,而char*中百分号也是使用%%表示。
例如:NSLog(@"%%%@%%",@"hello"),控制台会打印出%hello%。
printf([[NSString stringWithFormat:@"%%%@%%",@"hello"] UTF8String]),控制台则会打印出hello。
所以,如果需要使用像第三点那样模糊查询,需要使用下面的方法。
NSString *queryStr = [NSString stringWithFormat:@"select * from tb_table where title like'%%%%%@%%%%';",@"hello"];
再执行sqlite3_prepare_v2(database, [queryStr UTF8String], -1, &statement,NULL),即可将tb_table表中所有title字段中含有hello的条目查询出来。
004) 在iPhone开发中如何使用ModalViewController 切换View
iPhone开发中当程序中含有多个 view,需要在之间切换的时候,可以使用 UINavigationController,或者是 ModalViewController。UINabigationController 是通过向导条来切换多个 view。而如果 view 的数量比较少,且显示领域为全屏的时候,用 ModalViewController 就比较合适(比如需要用户输入信息的view,结束后自动回复到之前的view)。今天我们就看看 ModalViewController 的创建方法。
ModalViewController 并不像 UINavigationController 是一个专门的类,使用 UIViewController 的 presentModalViewController 方法指定之后就是 ModalViewController 了。
这里使用上两回做成的 CustomViewController(由UIViewController继承)来实现 ModalViewController 的实例。
首先,准备 ModalViewController 退出时的函数。调用 UIViewController 的 dismissModalViewController:Animated: 方法就可以了,如下所示:
// 这里按钮按下的时候退出 ModalViewController
-(void)dismiss:(id)inSender {
// 如果是被 presentModalViewController 以外的实例调用,parentViewController 将是nil,下面的调用无效
[self.parentViewController dismissModalViewControllerAnimated:YES];
}
接下来,生成另一个 CustomViewController 的实例,用来表示 ModalViewController,并将其对应的 view 设置成红色。然后传递给 presentModalViewController: Animated: 显示 ModalViewController 的 view。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
controller = [[CustomViewController alloc] init];
[window addSubview:controller.view];
[window makeKeyAndVisible];
// 生成 ModalViewController
CustomViewController* controllerB = [[CustomViewController alloc] init];
// 设置 view 的背景为红色
controllerB.view.backgroundColor = [UIColor redColor];
// 显示 ModalViewController view
[controller presentModalViewController:controllerB animated:YES];
// presentModalViewController 已经被 controller 管理,这里可以释放该实例了
[controllerB release];
}
编译执行以后,首先启动的是红色背景的 ModalViewController view、按下按钮后恢复到蓝色背景的通常 view 上。
也可以在显示 ModalViewController view 之前设置 UIViewContrller 的 modalTransitionStyle 属性,使其以动画形式显示。
controllerB.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
以上的实现只是单一地实现了 ModalViewController view 的功能,除了程序开始提醒用户一些信息外什么也做不了。另外由于是放入了 applicationDidFinishLaunching 中的原因,也不能反复的显示。另外,在 ModalViewController view 上设置的内容也不能反映到原来的 view 上。
接下来我们将实现这些功能。
首先,从 ModalViewController view 退出的时候,需要通知原先的 view。这里使用 iPhone/Cocoa 应用程序中经常使用的Delegate 设计模式(也是推荐使用的)。
实际上,系统所提供的图像选择控制类 UIImagePickerController。或者是参照地址簿时的ABPeoplePickerNavigationController 类,都用到了 Delegate 模式。
基于上一讲的中的例子,这里我们追加为3个按钮,分别是绿色,灰色和取消。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100,100,100,100);
button.tag = 1;
[button setTitle:@"绿色" forState:UIControlStateNormal];
// 按钮事件对应函数
[button addTarget:self action:@selector(dismiss:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100,200,100,100);
button.tag = 2;
[button setTitle:@"灰色" forState:UIControlStateNormal];
// 按钮事件对应函数
[button addTarget:self action:@selector(dismiss:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(100,300,100,100);
button.tag = 0;
[button setTitle:@"取消" forState:UIControlStateNormal];
// 按钮事件对应函数
[button addTarget:self action:@selector(dismiss:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
程序启动的时候依然是先显示 ModalViewController view,按下任何一个按钮,将关闭该view。按下“绿色”按钮,设置背景为绿色,按下“灰色”按钮时,设置背景为灰色。“取消”的时候什么也不做。
委托处理用下面的函数实现,当参数 inColor 为 nil 的时候代表取消。
-(void)selectColor:(UIColor*)inColor;
委托代理的实例用 id 变量表示。
@interface CustomViewController : UIViewController {
id colorSelectDelegate;
}
设置该变量的函数如下。
-(void)setColorSelectDelegate:(id)inDelegate {
colorSelectDelegate = inDelegate;
}
另外如上面 viewDidLoad 所示,按钮的 tag 分别为0、1、2。按钮按下时调用的函数中由不同的 tag 来发送不同的 UIColor实例到 colorSelectDelegate 上。
-(void)dismiss:(id)inSender {
UIView* view = (UIView*)inSender;
UIColor* requestColor = nil;
if (view.tag == 1)
requestColor = [UIColor greenColor];
if (view.tag == 2)
requestColor = [UIColor grayColor];
[colorSelectDelegate selectColor:requestColor];
}
这是不使用 UIButton* 而是用 UIView* ,是因为 tag 属性被定义在 UIView 类中,不需要必须转换为 UIButton 类。另外这样一来,该函数在 UIButton 以外的情况下也能被使用。如果想检查 id 是什么类性的可以使用 isKindOfClass: 方法。
接收到具体的参数 inColor 更换背景色,并关闭 ModalViewController view。
-(void)selectColor:(UIColor*)inColor {
if (inColor != nil)
self.view.backgroundColor = inColor;
[self dismissModalViewControllerAnimated:YES];
}
另外,在调用 presentModalViewController 之前(显示 ModalViewController view 之前),需要设定委托的实例。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
controller = [[CustomViewController alloc] init];
[window addSubview:controller.view];
[window makeKeyAndVisible];
// 创建 ModalViewController view 的 Controller
CustomViewController* controllerB = [[CustomViewController alloc] init];
// 设置背景色为红色
controllerB.view.backgroundColor = [UIColor redColor];
// 设置委托实例
[controllerB setColorSelectDelegate:controller];
// 显示 ModalViewController view
[controller presentModalViewController:controllerB animated:YES];
[controllerB release];
}
编译一下,程序启动后显示红色背景的 ModalViewController view,点击绿色按钮后,原先的view的背景变为绿色,点击灰色,显示灰色的背景,而点击取消,那么将显示原先蓝色的背景。
这样的形式,就是将按钮的动作委托给原先view的 Controller 来处理了。根据送来的 UIColor 来设置不同的背景色。
005)Cocos2D配Box2D:逆天小白程序员作iOS游戏
3个从未尝试过iOS游戏开发的小白组队参加编程马拉松,用7天的时间开发出一款iOS游戏并成功上架App Store,从idea到具体的开发过程,看他们是如何使用Cocos2D及Box2D成功开发出一款多边形切割游戏的。
来自俄罗斯数据分析公司Empatika 的Arseniy Vershinin和他的同事Anton、Valentine一起组队参加编程马拉松,此前,他们从未尝试过iOS游戏开发。但从idea思考到应用成功上架App Store,他们却只用了7天的时间。通过使用Cocos2D及Box2D引擎,成功开发出一款名为Slash Slash的多边形切割游戏。接下来,就让我们一起来看看,他们是如何做到的。
以下为Arseniy Vershinin在赛后所写下的参赛过程与心得体会:
在慕尼黑早晨6点左右,我和我的同事Anton、Valentine会合,一起为公司的一个编程马拉松思考idea。在此之前,我们所有人都没有任何正式的游戏开发经验,但我们觉得能够开发出一款游戏真的非常酷。因为此前,我们一直在为一些千篇一律的应用项目忙得不可开交,很想尝试做一些新奇的事情。在此次的编程马拉松活动中,我们通过使用2D图形引擎Cocos2D成功地完成了我们的第一款iOS游戏。
如何使用Cocos2D及Box2D来开发一款类水果忍者的iOS游戏?
我们一开始选择是做一个切披萨的游戏,一块让人垂涎欲滴的圆形披萨饼,在限定的时间内将它切割成许多块,就像水果忍者那样。切割的小块披萨我通过使用一些物理引擎进行移动,让游戏看起来不会太无聊。在经过一番研究之后,我们发现通过使用Cocos2D和Box2D,效果非常明显。
随后,我们根据White Widget 联合创始人之一Allen Tan的《如何使用Cocos2D及Box2D开发一款类水果忍者的iOS游戏?》教程指南来完成切割及三角算法等所有hardcore。Allen的教程指南主要依赖于PRKit库来实现凸纹理多边形的绘制,及扩展PRFilledPolygon类,以便于它能够提供一些其他功能,比如与Box2D物体保持同步。
尽管开发过程中最困难的一部分已得到解决,但在此之后我们还是遇到了许多未曾预料到的问题。比如在对初始项目做出调整,并进行了一系列的测试之后,我们发现Box2D限制了知名的8个顶点。为了运用到所有的示例代码及提供的库,我们将披萨设计为一个多边形,因为Box2D不允许将一个形状变为许多个弧形(即切割之后所获得的小块披萨形状)。因此,披萨不仅要偏圆形,还要可进行切割的,我们利用一组具有8个顶点的形状来构建它。但却也因此产生了一些细微的纹理问题,因为Allen Tan的教程在物体实现上介绍得非常详细。但是在进入深入开发阶段,我们设法通过为PRFilledPolygon输送一组顶点组成物体边缘来克服这一难题。
切披萨的碎片问题如何解决?
截至目前,一切似乎都非常完美,我们很好地完成了披萨饼的设计,但是到切割时却遇到了一个问题,一方面是当切割的披萨碎片数量达到200时,FPS会自动降低10帧左右,直接导致游戏无法继续进行。另一方面是对琐碎的碎片进行入画,因为切割而四溅的披萨碎片很容易相互碰撞。
这个问题让人头疼却也不难解决。我们进行了碰撞计算的设定,当一块碎片变得非常小时,这块碎片的碰撞计算就会自动关闭。但是游戏设置的修改进程仍然相当缓慢,因为我们想要在实现将细微碎片移除同时,玩家的金币值也要同步增加。为了避免琐碎的碎片在屏幕上疯狂地飞来飞去,我们还要为其设置一定的线性、角度缓冲值。
Valentine负责披萨的绘制,在我们对游戏设置进行开发时,他绘制出了一个非常引人食欲的披萨,而其切割过程也非常地简单、逼真。
切割无死角:简单到极致的多边形切割
然而,我们在测试中却明显地感觉到它并不太自然。我们的设计不是说一定要做到和披萨一模一样。首先需要保证的是切割无死角,因此,我们进行了披萨的重新设计,并且很快完成。通过向每个切片增加一个CCDrawNode及一组顶点,完全实现了多边形切割,此外,我们还为多边形的边缘部分进行塑造。这种效果要远比使用标准的CCDraw方式好得多,而且也更快。
切割操作很简单,因此我们以简单为原则,还设置了一个阻止切割的敌人——红点,以造成干扰。
此外,我们还编写了一个基于世界的级别系统。所有级别的.plist文件及形状描述、纹理规则、敌人位置、级别持续和其他一些参数都是单独存放的。.plists通过使用标准的Objective-C KVC包装游戏对象树。
//......
- (void)setValue:(id)value forKey:(NSString *)key{
if
([key isEqualToString:@
"position"
] && [value isKindOfClass:[NSString class]]){
CGPoint pos = CGPointFromString(value);
self.position = pos;
}
else
if
([key isEqualToString:@
"laserConditions"
]){
NSMutableArray *conditions = [NSMutableArray array];
for
(NSDictionary *conditionDescription
in
value){
LaserObstacleCondition *condition = [[LaserObstacleCondition alloc] init];
[condition setValuesForKeysWithDictionary:conditionDescription];
[conditions addObject:condition];
}
[
super
setValue:conditions forKey:key];
}
else
{
[
super
setValue:value forKey:key];
}
}
//......
//Afterawrds the values got set with the dictionary, read from the plist file:
[self setValuesForKeysWithDictionary: dictionary];
对于视觉效果,我们使用了非常酷的CCBlade。至于碎片淡出的部分则采用了PRfilledPolygon的CCLayerRGBA协议,为此,我们将默认的着色程序更改为kCCShader_PositionTexture_uColor。
-(id) initWithPoints:(NSArray *)polygonPoints andTexture:(CCTexture2D *)fillTexture usingTriangulator:(id<PRTriangulator>)polygonTriangulator{
if
( (self=[
super
init])) {
//Changing the default shader program to kCCShader_PositionTexture_uColor
self.shaderProgram = [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionTexture_uColor];
}
return
self;
}
//first we configure the color in the color setter:
colors[4] = {_displayedColor.r/255.,
_displayedColor.b/255.,
_displayedColor.g/255.,
_displayedOpacity/255.};
//then we pass this color as a uniform to the shader program, where
colorLocation = glGetUniformLocation( _shaderProgram.program,
"u_color"
)
-(void) draw {
//...
[_shaderProgram setUniformLocation:colorLocation with4fv:colors count:1];
//...
}
Arseniy等开发的iOS游戏 Slash Slash
=========================手机操作系统相关===================================
1)iOS 与Android 开发的不同点
OS开发者与Android开发者各有各的欣慰与神伤的事情,iOS开发者可以享用更好的测试机调试工具,IDE及图形界面开发环境,而Android开发者,最开心的事莫过于没有类似苹果App Store那样的审核过程。
Android机子繁多。第一个就是Android有各种不同的机子,这个大家都知道,每一款机子都可能运行着不同的Android版本,相比起iOS,要测试的更多。iOS完全没有这方面的顾虑。
反相兼容。大家都知道Google对Android版本的更新速度非常快,许多用户现在用的还是Android 2.x,许多手机可能在整个寿命阶段仅更新过几次,所以,开发者就需要让自己的代码要有很强的反相兼容能力。这方面,iOS好得多。
Android没有应用审核。这个对开发者来说省了很多时间,Android应用没有应用商店审核过程的,你可以在15分钟内就能上传更新应用,受苹果审核过程折磨的朋友们,永远不知道这是件多么爽的事情。
工具包差距大。Google提供的工具包,其SDK都稳定且文档详实,提供的开发工具一般都很强大,但与iOS SDK比起来还相去甚远。苹果在Xcode中的IDE远比Android的好,其图形界面的开发环境也远远优于Android,调试及测试工具更是令人惊叹,上面除了IDE,Android似乎该有的都有,只是不如苹果的那么出色。
2)iOS!你这几个方面该向Android好好学习
与老冤家Android相比,iOS近来可谓饱受“缺乏创新”屡遭诟病的困扰,业界更直言“iOS应该向Android看齐”!而在诸多拥有开放心态的人看来,苹果及谷歌的移动OS相互学习有何不可呢?为此,Ars Technica总结了iOS应该偷师Android的五大功能。
iOS缺乏创新的江河日下之风刮得已非一朝一夕,“相比Android,iOS越来越陈腐,它需要一些新创意!”之声不绝于耳,这也由此引发了业界对于“iOS应该向Android看齐”的热切讨论,而在那些拥有开放心态的人看来,苹果及谷歌的移动OS相互学习有何不可呢?为此,Ars Technica集众人智慧总结了iOS应该偷师Android的五大功能。
1> Google Now style的上下文感知服务
Google Now服务非常广泛,一方面,Google Now拥有Siri一样的语音指令,但这并不是我们所希望的iOS偷师的部分,我们希望苹果能有所借鉴的是Google Now支持通知的能力部分,还有其他一些基于上下文感知信息的服务,比如地理位置、日程安排等。
通过扫描用户日程表上即将到来的约会,Google Now可以为用户打算去的地方显示类似的路径选择及交通情况的通知。当用户接近一个公共车站时,还会显示交通时刻表,在用户接近他们可能会感兴趣的地点时,它也可以告知用户。
此外,Google Now也可以做些别的事情,比如检查你的历史搜索记录,继而Google Now开始为你提供相关信息的更新通知。还可根据你的E-mail信息进行相关日程提醒及包裹交付。当然,可能也会有用户不喜欢这个主意,不希望苹果自动过滤他们的E-mail或不断地探测他们的GPS位置信息。这一点,用户可自定义设置,如果拥有这些功能可以让我们使用得更舒适一点,何乐而不为呢?当然如果Siri可以执行相同(或类似)的功能,这也就不必要了。
2> 通知中心的快速设置
在iOS设备上有一些非常简单设置我们使用的频率要比其他高得多。对于我来说是iPhone上的Wi-Fi开/关切换,对于其他人而言,可能是屏幕亮度控制、“请勿打扰”转换或个人热点切换等等。
Android用户可以通过他们自定义的通知中心访问某些设置,以一种非常便捷的方式进行切换,不用退出应用即可进入设置界面。
当通知中心中有第三方应用时,你可以下拉其阴影处以进行亮度调整(或者关闭Wi-Fi、开启“请勿打扰”),而无需将该应用摆在第一位。至少,拥有类似的功能能够大大减少为了进行某一任务而点击的数量,从而简化了使用频率,也能够让iOS体验更让人愉快。
3> 自动更正及拼写建议
苹果在为iOS用户提供拼写建议及自动更正上的失败早已不是什么秘密。当你点击输入街道的名称或略感晦涩的词语时,iOS的确定就会出现错误。如果你不及时点击进行否定,iOS就会开始告知你它自动更正了什么词语。如果你像我一样,用你的手指一遍又一遍地点击你最初想要的那个词语,但iOS总会自动更正为它所想的词,然后你再退格或重新来过,再和iOS进行词语拼写的争斗,那你真的要疯了。
相比之下,Android用户就有更好的选择。当输入一个非常奇怪的单词时,Android系统会随着输入字眼的变化提供交替拼写。但更重要的是,如果它试图对你不想修改的词语进行自动更正,只要一个退格即可恢复原来的拼写。并且它会问你是否向字典中添加该词。
4> 设置默认应用的能力
或许相比Safari,你喜欢在你的iPhone上使用Chrome,但每次你查看E-mail时点击链接,打开的都是Safari浏览器。或许你喜欢Google Maps或Waze,但每次你都不得不使用苹果的地图应用,有没有方法改变这些默认使用的应用呢?
在iOS上自然也可以进行设置,但使用起来却并不理想。在Android系统中,当他们推出新的浏览器时,系统会询问是否将该浏览器设置为默认浏览器。或者,用户也可以进入应用管理器来更改他们的默认应用设置,选择是否在默认情况下启动该应用的特定功能。
5> 主屏幕快捷键放置在应用内
iOS允许用户设置主屏幕图标,就像为Web应用或Safari中的其他网页快速设置书签一样,非常方便。但你不能在原生应用中使用相同的功能来设置一个页面或功能的快捷键,而我们的Android朋友却可以。
在iOS上,我有大量的应用是经常使用的,因此,如果我可以在我的主屏幕上为它们创建一个快捷图标,点击它即可直接访问,那该有多方便。