ios个人总结学习
班 级 学生姓名 学 号
2015年1月8日
一、IOS应用开发概述
(一)IOS简介
iOS 操作系统是iPhone、iPod touch 以及iPad 设备的核心。IOS是由苹果公司开发的移动操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。iOS与苹果的Mac OS X操作系统一样,属于类Unix的商业操作系统。原本这个系统名为iPhone OS,因为iPad,iPhone,iPod touch都使用iPhone OS,所以2010WWDC大会上宣布改名为IOS(iOS为美国Cisco公司网络设备操作系统注册商标,苹果改名已获得Cisco公司授权)。
ios的优势:软件与硬件整合度高、界面美观、易操作、安全性强、应用数量多、品质高等;ios的缺点审美疲劳、过度依赖iTunes、不支持9宫格输入,只有全键盘和手写两种模式等。
(二)Xcode Xcode是一个集成开发环境,它负责管理应用程序工程。您可以通过它来编辑、编译、运行以及调试代码。Xcode还集成了许多其他工具,它是开发过程中使用到的主要应用程序。Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序。其运行于苹果公司的Mac操作系统下。
不管你用C、C++、Objective-C或Java编写程序,在AppleScript里编写脚本,还是试图从另一个奇妙的工具中转移编码,你会发现 Xcode 编译速度极快。每次操作都很快速和轻松。苹果公司为用户提供了全套免费的Cocoa程序开发工具(Xcode)。Mac OS X一起发行,在苹果公司官方的网站下载。
(三)Objective-C Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。
Objective-C是非常实际的语言。它是一个用C写成、很小的运行库,只会令应用程序的尺寸增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。Objective-C写成的程序通常不会比其原始码大很多。
(四)概念区分
Mac OS X是应用于手机端开发的;ios是用于手机移动端开发的。OC是Object-C的简称,是一种开发语言;Xcode是开发环境。
OOPL(Object Oriented Programming Language),面向对象的编程语言。
UI是using interface(UIview),是用户界面,UC是using controllers(View Controller)是视图控制下的。
二、系统概述
本系统的主要功能是实现用户登录,转屏、网页访问功能。
小组开发的系统是:权限站内搜索网页应用。登录功能的实现共有两种方式:用户名和密码出现错误跳转到错误提示屏、用户名和密码错误出现提示对话框。但在本次项目中采用的是第一种方式,登录进入之后可以实现网页搜索功能。
在本次系统实现过程中,我负责的是用户登录,实现信息验证。
三、系统实现
1、界面的布局:
首先是打开.storyboards的界面,然后添加主要的控件:两个label、两个textfield、两个button,还需要一个大button,让大button平铺整个屏幕。修改label的名字分别是:useName和password,button的名字是login和cancel。
图1:主界面
2、在ViewController.h中声明类 给两个textfields命名: @interface ViewController: UIViewController { IBOutlet UITextField *textOne;IBOutlet UITextField *textTwo;rightViewController *right;wrongViewController *wrong;} 所有的声明语句都要放在@interface和@end中间,UIViewController指的是用户界面下。注意是在括号中声明内容。IB指的是Internet Building,代表给程序员看的,UITextField说明的是用户界面上的那个TextField,*textOne,*是以指针的形式命名为textOne。新建的两个屏为rightViewController和wrongViewController,再进一步取名为right和wrong。
拖住UITextField到声明的代码中,确保填写的代码和所指的文本框上是相对应的,即在代码前面是实心圆。分别拖住login、cancel和大button按钮到.h文件中,选择action动作,命名为login,此时在生成一下代码:
-(IBAction)login:(id)sender;-(IBAction)quit:(id)sender;-(IBAction)cancelText:(id)sender;
IBAction是定义一个动作的方法名字是login,(id)sender代表针对所有控件的id。
3、在ViewController.m文件中实现代码消失
首先当在文本框输入完信息之后,点击大button实现键盘的退出。具体代码如下:-(IBAction)quit:(id)sender{ [textOne resignFirstResponder];[textTwo resignFirstResponder];}
4、在ViewController.m文件中实现取消按钮的功能
-(IBAction)cancelText:(id)sender{ textOne.text=””;textTwo.text=””;} 当点击取消按钮的时候,会触发action动作,那么textOne和textTwo的内容会自动被清空。
5、在ViewController.m文件中实现用户名和密码的验证
代码写在-(IBAction)login:id(id)sender{}内,具体实现的代码如下: If([textOne.text isEqualToString:@”aaa”]&& [textTwo.text is EqualToString:@”123”]){ right=[[rightViewController alloc] initWithNibName:@”rightViewCountroller” bundle:nil];[self.view addSubview:right.view];} else { wrong=[[wrongViewController alloc] initWithNibName:@”wrongViewCountroller” bundle:nil];[self.view addSubview:wrong.view];} 这是一个if条件判断语句,当textOne中的内容是“aaa”,并且textTwo中的内容是123的时候才会登录进入到正确的一屏,否则会自动跳转的错误的提示屏。
“@”代表后面的内容是字符串,alloc指代内存分配,initWithNibName指初始化的名字为:rightViewController,并且需要与alloc前面的rightViewController名字完全一致。Bundle:nil指的是:绑定为空
[self.view addSubview:right.view];转屏到rightViewController。
四、总结
通过本次课程的学习主要掌握了以下几方面的内容:
1、定义变量和工程的规则是:采用驼峰命名法,即:第一个单词首字母小写,其余单词首字母大写。
2、每个工程文件中共包含三个类型的文件:.h.m.xib.h文件:用于定义、声明类;.m文件:主要编写代码、执行;.xib(.storyboards):界面的显示;
随着国内改革之强烈,结构调整力度之大,很多企业都开始谋求新的出路,削减人员几乎成了一个普遍的现象。对于刚大学毕业的学生来说,面对的是越来越大的就业压力,不光是大学毕业生,很多久经职场的人员也开始抱怨找工作越来越难了。特别是对大学生来说,年轻经验不足,一旦遇到这种情况,就会比较焦虑,甚至不知所措,不知道往哪个方向走。不知道是继续死磕着找工作还是先学习技术增强自身能力以后寻找更好的出路,学习技术又不知道学习什么好?针对这种情况,目前iOS开发还是非常不错的,在薪资水平和工作环境都非常不错。
从目前的大趋势来看,学习iOS开发是能够很好的缓解就业压力的,找到一份好工作不算难,可以说学习iOS开发成高薪之路,现在再不学以后真的就晚了。
苹果iPhone系列产品在全球范围内受到了广泛的追捧,创造了庞大的应用市场,使应用开发公司开始争抢iOS开发者。App Store下载量已经超过500亿,另外,由于iOS系统开发技术在智能手机系统里走在前列,其他系统平台应用开发公司和系统研发公司也在同时高薪挖角。72%的招聘公司称,他们正在招聘iOS平台开发人才,其中38%的招聘公司表示,iOS平台开发经验要比任何其他平台开发经验更受招聘公司青睐。
1.关联
objc_setAssociatedObject关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。
2.tableView的beginUpdates 和 endUpdates
3.关于代码与storyBoard的自动布局
4.国际化与本地化,为了实现全球化
5.技巧
可以通过设置Scheme来设置app所运行的语言,你想要什么语言就是什么语言,而不用重新设置系统的语言。
6.ios8新特性,加载js
如果我想要加载一个形如网页的东西,那么我需要对整个网页进行动态的编辑,图文混编,但是这样做那面会带来很困难的操作,其实服务端那边很好的可以解决这个问题,用一个网页即可以搞定。服务端那边只需返回一个html文档,然后客户端根据这个html文档进行解析即可。
WKWebView新特性
· 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
· 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
· 支持了更多的HTML5特性;
· 高达60fps的滚动刷新率以及内置手势;
· 将UIWebViewDelegate与UIWebView重构成了14类与3个协议
7.技巧
写 函数的时候一定要判断数据的安全性,这样出错的几率就会很小,尤其是要判断它的类型安全,是否为空等,不然程序会奔溃。还有需要注意的地方就是,写每一个函数的时候要多方面进行考虑,考虑代码的合法性。使用前不判断参数的正确性,在函数内部对参数的可靠性进行判断。如果这样的话,你用到函数的时候都需要对这些参数进行判断其合法性如果放倒函数中那么只需要判断一次就可以了。
8.应用内购买
9.利用sqlite创建索引,索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
10.数据库版本的更新,当应用数据表需要添加新表的时候,需要对数据插入新的字段,那么久需要更新数据库
11.友盟统计,当应用上线后可以观察到应用的日志文件,crash日志,页面记时日志,收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。
12.使用js的时候需要使用webView
[webView stringByEvaluatingJavaScriptFromString:scriptString];
13.做常用设备登陆的策略可以使用服务器,服务器把所有登陆过的设备都存储下来。
14.涉及到系统偏好设置的选项,把它都放到一个文件中,这样修改起来比较容易。
15.利用VVDocumenter-Xcode自动生成注释,也就是xcode的插件.运行VVDOcumenter-Xcode编译后,重新打开xcode即可以使用了
16.如何使用xib进行界面的搭建,利用file’s owner进行关联,形如storyBoard中的segue
17.如何在一个项目中使用多个storyBoard
18.如何利用代码与storyBoard或者XIB进行自动布局
19、XIB进行国际化
首先在工程中需要添加你想要使用的语言,然后新建视图的时候选择使用XIB,这样xcode就会自动为你新建一个xib文件,然后在inspector中的localization中选择localized,开始时一定要选择base,然后勾选其他语言,这样你发现XIB文件会有子目录,然后在子目录下你可以设置不同的语言翻译。
20.tableView小技巧
根据设置不同的identifier取出不同类型的cell,在设置identifier的时候可以设置成类名,这样的话就可以省很多事,而且很方便。
21. 技巧
[[UIApplication sharedApplication] setStatusBarHidden:YES];
22.版本控制
gitLab和sourceTree结合使用对源代码进行管理,如何进行相关的配置
23.发送语音消息
三方库opencore-amr
24.Sqlcipher+FMDB,数据库文件加密
www.zetetic.net/sqlcipher/ios-tutorial/
25.技巧
图片浏览XHImageViewer
26.技巧
根据button的不同状态可以设置button的事件,相当于微信发送语音信息的按钮,按住录音,松开结束录音并发送消息,
27.技巧
把block指针变量设置成私有的,这样是不是很好用。
28.关于runloop的一些了解,runloop是一种运行池,是和多线程有关的东西,监听事件的产生,如果有新事件,那么runloop会监听,一旦监听到了,就会执行监听到的方法。
29.技巧
关于用户头像的问题,点击放大,等其他手势的库ESImageViewController
30.技巧
NSString *pullSuccessIdString = [pullSuccessMsgIds componentsJoinedByString:@“,”];
把数组中的每个元素用逗号拼接成一个字符串
31.数据共享
Multipeer Connectivity Framework ,近距离通信,双方建立连接后可以彼此进行通信
32.问题
oc中不支持多继承,也就说一个类只能继承至一个类,不能继承多个类。实现多继承可以使用协议来实现,也就说某个类中可以继承多个协议,这久相当于多继承,我可以拥有很多协议并且实现它。
33.multipeerConnectivity的实现,对文件进行共享
34.indexPathForSelectedRow
35如何给另一台电脑进行真机调试
《1》导出p12文件
《2》导出描述文件
这些api包含的绘制操作都在一个图形环境中进行绘制。一个图形环境包含绘制参数和所有的绘制需要的设备特定信息,包括屏幕图形环境、offscreen 位图环境 和PDF图形环境,用来在屏幕表面、一个位图或一个pdf 文件中进行图形和图像绘制。在屏幕图形环境中进行的绘制限定于在一个UIView 类或其子类的实例中绘制,并直接在屏幕显示,在offscreen 位图 或 PDF图形环境中进行的绘制不直接在屏幕上显示。
1 、UIKIT API
UIKIT是一组Objective-C API,为线条图形、Quartz图像和颜色操作提供Objective-C 封装,并提供2D绘制、图像处理及用户接口级别的动画。
UIKIT包括UIBezierPath(绘制线、角度、椭圆及其它图形)、UIImage(显示图像)、UIColor(颜色操作)、UIFont和UIScreen(提供字体和屏幕信息)等类以及在位图图形环境、PDF图形环境上进行绘制和 操作的功能等, 也提供对标准视图的支持,也提供对打印功能的支持。
在UIKIT中UIView类本身在绘制时自动创建一个图形环境(对应Core Graphics层的CGContext类型)作为当前的图形绘制环境。在绘制时可以调用UIGraphicsGetCurrentContext 函数获得当前的图形环境。
2 、Core Graphics 与Quartz 2D API
Core Graphics是一套C-based API, 支持向量图形,线、形状、图案、路径、剃度、位图图像和pdf 内容的绘制。
Quartz 2D 是Core Graphics中的2D 绘制呈现引擎。Quartz是资源和设备无关的,提供路径绘制,anti-aliased呈现,剃度填充图案,图像,透明绘制和透明层、遮蔽和阴影、颜色管理,坐标转换,字体、offscreen呈现、pdf文档创建、显示和分析等功能。
Quartz 2D能够与所有的图形和动画技术(如Core Animation, OpenGL ES, 和 UIKit 等)一起使用。
Quartz采用paint模式进行绘制。
Quartz 中使用的图形环境也由一个类CGContext表示。
在Quartz 中可以把一个图形环境作为一个绘制目标。当使用Quartz 进行绘制时,所有设备特定的特性被包含在你使用的特定类型的图形环境中,因此通过给相同的图像操作函数提供不同的图像环境你就能够画相同的图像到不同的设备上,因此做到了图像绘制的设备无关性。
Quartz 为应用提供如下几个图形环境:
1)位图图形环境,用来创建一个位图。
使用函数CGBitmapContextCreate来创建。
2)PDF图形环境,用来创建一个pdf文件。
Quartz 2D API提供了两个函数来创建一个PDF图形环境:
CGPDFContextCreateWithURL,带有一个作为pdf 输出的位置的Core Foundation URL来创建一个pdf 图形环境。
CGPDFContextCreate, 当想PDF 输出到一个data consumer时使用该函数。
3) 窗口图形环境,用来在一个窗口上进行绘制。
4) 层环境(CGLayer) ,是一个与另一个图形环境关联的offscreen绘制目标,使用层环境的目的是为了优化绘制层到创建它的图形环境的性能。层环境能够比位图图形环境提供更好的offscreen绘制性能。
Quartz提供的主要类包括:
CGContext:表示一个图形环境;
CGPath:使用向量图形来创建路径,并能够填充和stroke;
CGImage:用来表示位图;
CGLayer:用来表示一个能够用于重复绘制和offscreen绘制的绘制层;
CGPattern:用来表示Pattern,用于重复绘制;
CGShading和 CGGradient:用于绘制剃度;
CGColor 和 CGColorSpace;用来进行颜色和颜色空间管理;
CGFont, 用于绘制文本;
CGPDFContentStream、CGPDFScanner、CGPDFPage、CGPDFObject,CGPDFStream, CGPDFString等用来进行pdf文件的创建、解析和显示。
3、OpenGL ES和GLKit
OpenGL ES是一套多功能开放标准的用于嵌入系统的C-based的图形库,用于2D和3D数据的可视化。OpenGL被设计用来转换一组图形调用功能到底层图形硬件(GPU),由GPU执行图形命令,用来实现复杂的图形操作和运算,从而能够高性能、高帧率利用GPU提供的2D和3D绘制能力。
OpenGL ES规范本身不定义绘制表面和绘制窗口,因此ios为了使用它必须提供和创建一个OpenGL ES 的呈现环境,创建和配置存储绘制命令结果的framebuffer 及创建和配置一个或多个呈现目标。
在 IOS中使用EAGL提供的EAGLContext类 来实现和提供一个呈现环境,用来保持OpenGL ES使用到的硬件状态。 EAGL是一个Objective-C API,提供使OpenGL ES与Core Animation和UIKIT集成的接口。
在调用任何OpenGL ES 功能之前必须首先初始化一个EAGLContext 对象。
每一个IOS应用的每一个线程都有一个当前context,在调用OpenGL ES函数时,使用或改变此context中的状态。
EAGLContext 的类方法setCurrentContext: 用来设置当前线程的当前context。EAGLContext 的类方法currentContext 返回当前线程的当前context。在切换相同线程的两个上下文之前,必须调用glFlush函数来确保先前已提交的命令被提交到图形硬件中。
可以采用不同的方式使用OpenGL ES以便呈现OpenGL ES内容到不同的目标:GLKit和CAEAGLLayer。
为了创建全屏幕的视图或使OpenGL ES内容与UIKit视图集成,可以使用GLKit。在使用GLKit时,GLKit提供的类GLKView类本身实现呈现目标及创建和维护一个framebuffer。
为了使OpenGL ES内容作为一个Core Animation层的部分内容时,可以使用CAEAGLLayer 作为呈现目标,并需要另外创建framebuffer以及自己实现和控制整个绘制流程。
GLKit是一组Objective-C 类,为使用OpenGL ES 提供一个面向对象接口,用来简化OpenGL ES应用的开发。GLKit支持四个3D应用开发的关键领域:
1) GLKView 和GLKViewController类提供一个标准的OpenGL ES视图和相关联的呈现循环。GLKView可以作为OpenGL ES内容的呈现目标,GLKViewController提供内容呈现的控制和动画。视图管理和维护一个framebuffer,应用只需在framebuffer进行绘画即可。
2)GLKTextureLoader 为应用提供从IOS支持的各种图像格式的源自动加载纹理图像到OpenGL ES 图像环境的方式,并能够进行适当的转换,并支持同步和异步加载方式。
3)数学运算库,提供向量、矩阵、四元数的实现和矩阵堆栈操作等OpenGL ES 1.1功能。
4)Effect效果类提供标准的公共着色效果的实现。能够配置效果和相关的顶点数据,然后创建和加载适当的着色器。GLKit 包括三个可配置着色效果类:GLKBaseEffect实现OpenGL ES 1.1规范中的关键的灯光和材料模式, GLKSkyboxEffect提供一个skybox效果的实现, GLKReflectionMapEffect 在GLKBaseEffect基础上包括反射映射支持。
使用GLKView和OpenGL ES进行绘制过程:
1)创建一个GLKView 对象
GLKView 对象可以编程或使用Interface Builder来创建和配置。
在采用编程方式时,首先创建一个context然后调用initWithFrame.:context: 方法。
使用Interface Builder方式时,在从storyboard加载一个GLKView后,创建一个context和设置它作为视图的context属性.
在iOS中GLKit的使用需要创建OpenGL ES 2.0以上的图形环境context。
GLKit视图自动创建和配置它所有的OpenGL ES framebuffer对象和renderbuffers,可以通过修改视图的drawable属性来控制这些对象的属性。
2)绘制OpenGL内容(发布绘制命令)
使用GLKit视图绘制OpenGL内容需要三个子步骤:准备OpenGL ES基础;发布绘制命令;呈现显示内容到Core Animation。 GLKit类本身已经实现了第一个和第三个步骤,用户只需实现第二个步骤,在视图的方法drawRect或视图的代理对象的glkView:drawInRect:中调用适当的OpenGL ES绘制命令进行内容绘制。
GLKViewController类维护一个animation 呈现循环(包含两个方法update和display),用来实现连续的动画复杂的场景。
animation 呈现循环的交替速率由GLKViewController的属性framesPerSecond 指示,并使用preferredFramesPerSecond 属性来修改它。
4、其它图形编程相关API
1)、Core Animation
Core Animation是一套Objective-C API,实现了一个高性能的复合引擎,并提供一个简单易用的编程接口,给用户UI添加平滑运动和动态反馈能力。
Core Animation 是 UIKit实现动画和变换的基础,也负责视图的复合功能。使用Core Animation可以实现定制动画和细粒度的动画控制,创建复杂的、支持动画和变换的layered 2D视图。
Core Animation不属于绘制系统,但它是以硬件复合和操作显示内容的基础设施。这个基础设施的核心是layer对象,用来管理和操作显示内容。在ios 中每一个视图都对应Core Animation的一个层对象,与视图一样,层之间也组织为层关系树。一个层捕获视图内容为一个被图像硬件容易操作的位图。在多数应用中层作为管理视图的方式使用,但也可以创建独立的层到一个层关系树中来显示视图不够支持的显示内容。
OpenGL ES的内容也可以与Core Animation内容进行集成。
为了使用Core Animation实现动画,可以修改层的属性值来触发一个action对象的执行,不同的action对象实现不同的动画。
Core Animation 提供了一下一组应用可以采用的类来提供对不同动画类型的支持:
CAAnimation是一个抽象公共基类,CAAnimation采用CAMediaTiming 和CAAction协议为动画提供时间(如周期、速度、重复次数等)和action行为(启动、停止等)。
CAPropertyAnimation是 CAAnimation的抽象子类,为动画提供一个由一个key路径规定的层属性的支持;
CABasicAnimation 是CAPropertyAnimation的具体子类,为一个层属性提供简单插入能力。
CAKeyframeAnimation也是CAPropertyAnimation的具体子类,提供key帧动画支持。
CATransition是CAAnimation的具体子类,提供影响整个层内容的事物效果。
CAAnimationGroup也是CAAnimation的子类,允许动画对象组合到一起并同时运行。
2)Image I/O
Image I/O 提供读写多数格式图像文件的数据的接口。主要包括图像源CGImageSourceRef和图像目标CGImageDestinationRef两个类。
3)Sprite Kit
Sprite Kit建立于OpenGL ES之上,Sprite Kit使用图形硬件来有效的呈现动画帧,因此可以高帧率地动画和呈现任意的2D纹理图像或游戏sprite,呈现的内容包括sprites、文本、CGPath形状、视频等。
在Sprite Kit中动画和呈现由一个SKView 视图对象执行。游戏的内容组织为以SKScene 对象表现的一个个场景。一个场景包含要呈现的sprites和其它内容,一个场景也实现每个帧关联的逻辑和内容处理。
在同一时刻,一个SKView视图只呈现一个场景,在场景呈现时,场景关联的动画和帧关联的逻辑被自动执行。在切换场景时使用SKTransition 类来执行两个场景间的动画。
4)SceneKit
SceneKit是一个使用3D图形技术实现的Objective-C 框架,包含一个高性能的呈现引擎和一个高级的描述性API。可以利用该框架创建简单的游戏和界面丰富的用户UI,使用SceneKit仅需要使用描述性API描述你的场景的内容(如几何形状、材料、灯光和摄像等)和你想在那些内容上要执行的行动或动画即可。
SceneKit的内容组织为由节点组成的树形结构,称为scene graph。一个场景包含一个根节点,定义场景的坐标空间,其它节点定义场景的可视内容。SceneKit在GPU上呈现每一帧之前在一个视图上显示场景、处理scene graph和执行动画处理。
SceneKit包含的主要类:
SCNView & SCNSceneRenderer:SCNView是显示或呈现SceneKit内容的视图。SCNSceneRenderer是一个协议,定义用于视图的一些重要方法。
SCNScene: 表现一个场景,是所有SceneKit内容的一个容器。场景可以从使用3D著作工具创建的一个文件中加载,也可以编程创建,场景需要在一个视图上显示,
电脑资料
SCNNode:一个场景的基本构造块,表示scene graph树的一个节点。scene graph树定义了场景上节点之间的逻辑结构,通过为一个节点附属geometries、lights、cameras来提供场景的可视内容。
SCNGeometry、SCNLight、SCNCamera:分别是geometries、lights、cameras对应的类。SCNGeometry为场景提供形状、文本或定制顶点数据,SCNLight为场景提供阴影效果,SCNCamera为场景提供可视点。
SCNMaterial:为SCNGeometry对象定义表面外观属性,规定对象表面如何着色或纹理以及如何反应灯光。
SceneKit内容的动画:
SceneKit动画基于Core Animation 框架,可以隐式或显式创建。
隐式创建是实际是通过动画节点的一些动画属性来实现:SceneKit自动在run loop一次运行期间对一个场景包含节点属性的所有改变组合成一个原子操作,称为一个事务,由SCNTransaction 类表示;当设置SCNTransaction类的动画周期不为0时,所有对节点动画属性的改变自动执行动画。
如下代码片段所示:
func fallAndFade(sender: a href=“” AnyObject /a ) {SCNTransaction.setAnimationDuration(1.0)textNode.position = SCNVector3(x: 0.0, y: -10.0, z: 0.0)textNode.opacity = 0.0 }
显式创建动画时,可以选择CAAnimation一种类型的子类来创建特定类型的动画。使用key-value为动画规定属性及设置动画参数,然后把创建的动画附属到场景的一个或多个元素。可以使用不同的Core Animation动画类组合或序列化几个动画或创建动画在几个 keyframe值之间插入属性值。
如下代码片段为显式创建动画的例子:
let animation = CABasicAnimation(keyPath: “geometry.extrusionDepth”) animation.fromValue = 0.0 animation.toValue = 100.0 animation.duration = 1.0 animation.autoreverses = true animation.repeatCount = Float.infinity textNode.addAnimation(animation, forKey: “extrude“)
SceneKit也支持使用SCNSceneSource 类从一个场景文件中加载CAAnimation动画对象,然后附属它到SCNNode对象。
5)Metal
Metal框架是一个OpenGL ES类似的底层API,为GPU加速的先进的3D图形呈现或数据并行计算任务提供支持。Metal负责和3D绘图硬件交互,为图形和计算命令的组织、处理、提交和相关资源和数据的管理提供一个细粒度的、底层的支持流式计算的现代API。Metal的目标是在执行GPU任务时尽量减少CPU的负载,消除在GPU执行图形和数据并行计算操作时的性能瓶颈,能够有效的使用多线程并行创建和提交命令到GPU。
Metal也提供了一个映射编程语言用来编写能够被Metal应用使用的图形映射或计算函数。Metal 映射语言编写的代码能够在编译时与应用代码一起被编译,然后在运行时被加载到GPU上执行;也支持运行时对Metal 映射语言代码进行编辑。
在Metal架构中包括如下几个重要的类或协议:
1、MTLDevice协议和对象
一个MTLDevice代表一个执行命令的GPU设备,MTLDevice协议为其定义了相关接口,包括查询设备能力属性和创建其它设备特定的对象等接口,例如创建命令队列、从内存中分配缓冲区以及创建纹理等。
应用通过调用MTLCreateSystemDefaultDevice 函数来获取一个系统能够使用的MTLDevice对象。
2、命令和命令编码器
在Metal框架中,3D图形呈现命令、计算命令和blitting命令在提交到特定设备GPU上执行前必须进行相应的格式编码,以便能够被GPU识别和执行。
Metal框架为每种命令提供了一种编码器协议:
MTLRenderCommandEncoder 协议:提供接口用来编码一个单次循环呈现期间要执行的3D图形呈现命令。MTLRenderCommandEncoder 对象用来代表一次图形呈现流程的呈现状态和绘制命令。
MTLComputeCommandEncoder协议:提供接口用来编码数据并行计算任务。
MTLBlitCommandEncoder协议:提供接口用来编码在缓冲和纹理之间的简单拷贝操作。
在同一时刻,仅能有一个命令编码器激活来添加命令到一个命令缓冲空间上,即每一个命令编码器必须在另一个使用相同命令缓冲空间的命令编码器创建前结束。
Metal为了支持多个不同任务的并行执行,提供了一个MTLParallelRenderCommandEncoder协议来支持多个MTLBlitCommandEncoder在不同线程同时运行提交不同的命令缓冲到同一个命令缓冲空间。每一个线程有一个它自己的命令缓冲对象,在同一时刻,该缓冲对象只能被该线程的一个命令编码器存取。
MTLParallelRenderCommandEncoder对象允许一次呈现循环的命令编码分解到多个命令编码器进行编码,使用多线程进行并行处理来提高处理效率。
一个命令编码器对象调用endEncoding 方法来结束。
命令编码器对象的创建:
命令编码器对象由MTLCommandBuffer对象负责创建。MTLCommandBuffer协议定义了如下方法用来创建相应类型的命令编码器对象:
renderCommandEncoderWithDescriptor: 为执行图形呈现任务创建一个MTLRenderCommandEncoder 对象。方法的参数MTLRenderPassDescriptor表现一个编码呈现命令的目标(是一个附属点的集合,最多可以包括四个颜色点数据附属点、一个深度点数据附属点、一个图案点数据附属点),在MTLRenderPassDescriptor对象的附属点属性中指定要呈现的图形目标。
computeCommandEncoder方法为数据并行计算任务创建一个MTLComputeCommandEncoder 对象。
blitCommandEncoder 方法为内存Blit操作和纹理填充操及mipmaps的产生等操作创建一个MTLBlitCommandEncoder 对象。
parallelRenderCommandEncoderWithDescriptor: 方法创建一个MTLParallelRenderCommandEncoder对象。呈现目标由 参数MTLRenderPassDescriptor规定。
3、命令缓冲MTLCommandBuffer对象及协议
在经过命令编码器编码后的命令被命令编码器添加到一个称为命令缓冲的MTLCommandBuffer对象上,然后该CommandBuffer对象被提交到GPU来执行其中包含的命令。
MTLCommandBuffer协议为CommandBuffer对象定义接口以及提供命令编码器的创建、提交CommandBuffer到一个命令队列以及检查状态等操作方法。
一个CommandBuffer对象包含打算在特定设备(GPU)上执行的被编码的命令。一旦所有的编码完成,CommandBuffer本身必须提交到一个命令队列,并标记命令缓冲为准备好状态,以便能够被GPU 执行。
在标准标准应用中,通常一个呈现帧的呈现命令使用一个线程被编码进一个命令缓冲中。
MTLCommandBuffer对象的创建和相应方法:
一个MTLCommandBuffer对象由MTLCommandQueue的commandBuffer方法或commandBufferWithUnretainedReferences方法创建。
一个MTLCommandBuffer对象仅能提交到创建它的MTLCommandQueue 对象中。
一个MTLCommandBuffer对象还实现协议定义的如下方法:
enqueue方法用来在命令队列中为该命令缓冲保留一个位置。
commit 方法使MTLCommandBuffer对象被提交执行。
addScheduledHandler:方法用来为一个命令缓冲对象登记一个在该命令缓冲被调度时被调用的代码执行块。可以为一个命令缓冲对象登记多个调度执行块。
waitUntilScheduled 方法等待命令缓冲被调度及在为该命令缓冲登记的所有调度执行块已经执行完。
addCompletedHandler:方法为一个命令缓冲对象登记一个在设备已经执行完该命令缓冲后被调用的代码执行块。也可以为一个命令缓冲对象登记多个完成执行代码块。
waitUntilCompleted 方法等待命令缓冲中命令被设备执行完和为该命令缓冲登记的所有完成执行块都执行结束。
presentDrawable:方法用来在命令缓冲对象被调度时呈现一个可显示资源(CAMetalDrawable 对象)的内容。
4、MTLCommandQueue协议和命令队列对象
MTLCommandQueue协议为包含命令缓冲的一个队列。命令队列用来组织其中包含的命令缓冲对象的执行次序和控制命令队列中的命令缓冲对象包含的命令什么时候被执行。
MTLCommandQueue协议为命令队列定义了接口,主要的接口包括命令缓冲对象的创建。
MTLCommandQueue对象的创建:
使用MTLDevice对象的newCommandQueue方法或newCommandQueueWithMaxCommandBufferCount:方法来创建一个命令队列对象。
下图为以上这些对象之间的关系图:
如图中所示:必须为一个呈现命令编码器设置呈现相关的状态、设置和创建相关的呈现用到的缓冲区、纹理等Metal资源对象。
为呈现命令编码器指定的状态包括一个呈现管道流水线状态(Render Pipeline State),一个深度和图案状态(Depth Stencil State),一个采样状态(Sampler State)。
一个Blit命令编码器与一个缓冲区和一个纹理关联,用来在两者之间进行Blit操作。
命令编码器指定图形或计算功能时可以分配三种类型的MTLResource Metal资源对象使用:
MTLBuffer 表现一个能够包含任意类型数据的无格式内存。MTLBuffer通常用于多边形顶点vertex、着色器shader及计算状态数据。
MTLTexture表现一个有着特定纹理类型和点格式的具有相应格式的图像数据。纹理对象可以作为多边形顶点vertex、片段fragment或计算功能的一个源,也可以在呈现描述符中作为图形呈现的输出目标。
MTLSamplerState对象当一个图形或计算功能在一个MTLTexture上执行纹理采样操作时使用,用来定义地址、过滤和其它属性。
图形呈现编码器MTLRenderCommandEncoder 可以使用setVertex*及setFragment* 方法组作为其参数来为相应的映射函数分配一个或多个资源。
5、CAMetalLayer 对象和CAMetalDrawable 协议
Core Animation定义了一个CAMetalLayer类和一个CAMetalDrawable 协议用来提供一个Metal内容呈现的层后备视图。CAMetalLayer对象包含有关要呈现内容的位置、尺寸、可视属性(背景颜色、边界和阴影)及Metal呈现内容使用到的资源等。CAMetalDrawable 协议是MTLDrawable 的扩展,指定了可显示资源对象要符合的MTLTexture协议,使可显示资源对象可用作呈现命令的目标。
为了实现Metal内容在一个CAMetalLayer对象的呈现,应为每次呈现流程创建一个CAMetalDrawable对象,从中得到它包含的MTLTexture 对象,然后在呈现流水线描述MTLRenderPipelineDescriptor 的颜色附属点属性中使用,指定其为图形呈现命令的目标。
一个CAMetalLayer对象调用CAMetalLayer 对象的nextDrawable 方法来创建。
在创建一个可显示资源作为图形命令的目标后,就可以调用如下步骤完成图形的绘制。
1)、首先创建一个MTLCommandQueue 对象,然后使用它创建一个MTLCommandBuffer对象;
2)、创建一个MTLRenderPassDescriptor对象,为其规定用作图形缓冲中的编码呈现命令目标的附属点集合;然后使用这个MTLRenderPassDescriptor 对象创建一个MTLRenderCommandEncoder对象;
3) 创建相应的Metal资源对象,来存储绘制用到资源数据,如顶点坐标和顶点颜色数据;并调用MTLRenderCommandEncoder的setVertex*:offset:atIndex: 和setFragment* :offset:atIndex:方法来为呈现编码器指定用到的资源;
4) 创建一个MTLRenderPipelineDescriptor 对象并为其指定vertexFunction和fragmentFunction 属性,这些属性使用Metal映射语言代码中读取的相应映射函数MTLFunction对象来设置。
5)使用MTLDevice的newRenderPipelineStateWithDescriptor:error:方法或类似方法并根据MTLRenderPipelineDescriptor创建一个MTLRenderPipelineState对象;然后调用MTLRenderCommandEncoder 的setRenderPipelineState: 方法来为呈现编码器对象MTLRenderCommandEncoder设置管道流水线;
我还找到一种学习方法,那就是有一个可以交谈的、活生生的人。
我的合伙创始人Josh,主要做Python开发,实际上和我一起学习Objective-C,并为我解答了很多编程理论方面的问题(“怎么让一个if语句再次起作用?”),在我真正遇到难题时帮我调试。
至少有了极具耐心的编程伙伴,他可以解释基本的编程原则,这是莫大的帮助。在我用Objective-C搞清楚具体细节之前,Josh经常帮助我思考解决某个问题的大部分逻辑方法。
善用资源
如果你不够幸运,身边缺少有耐心的程序员解答问题,那么,其它一些地方可以让你从真实的人那里获得帮助:
Stack Overflow
关于具体语法或实现的问题,Stack Overflow是我最近访问最多的网站之一。我自己还没有在那儿问过问题(由于该社区对初学者相当友好,我对提问持谨慎态度),因为我很少需要去问——通过浏览其他人的问题的答案,我的大部分问题就得到解决了。
Treehouse
Treehouse通过视频课程教授编程,还建立了社区论坛,你可以在这里讨论有困难的bug,或者你在听课过程中碰到的具体练习。
askadev
在你需要帮助的时候,askadev支持你联系到有经验的开发者。我还没有尝试过这项服务,因此我不知道有多大用处、或是否囊括了所有编程语言,不过它是免费的,下次你有需要,不妨一试。
Codementor
如果你想给有经验的开发者支付现金来获得帮助,Codementor会把你和熟悉你在学的语言的人匹配到一起。它们涵盖了Android、iOS、HTML、CSS、PHP、Python,以及很多技术。
小黄鸭问题解决
如果你以前没有看到,《小黄鸭式解决问题》的博文是非常有用的。具体操作是:对着一个小黄鸭或其它静物,比如面包机,阐述你的问题,大声点儿。大声讲述问题的过程,经常有助于你自己意识到答案(或至少知道错在哪里了)。我已经发现,大声地讨论我的代码是一种难以置信的好习惯,每次在我找别人帮忙之前,我都要尽量这样做。
学习规范
在我学习编程的时光里,最影响我的就是对于我正在使用技术的误解和陌生。比如,开发API意味着我需要理解API的工作原理、怎样使用POST和GET请求、怎样分析JSON数据,甚至我需要掌握接收JSON数据。
学习Objective-C不是开发iOS app所需要知道的全部,至少,不是我想开发的那种。我犯了个错误,我认为只要知道Objective-C就行了。甚至更糟糕的,我经常遇到困难,因为Stack Overflow回答问题的人、在线教程和书籍章节都在解释如何用Objective-C开发,完全跳过了必需的、我需要知道的、基于web的原则,因为他们认为我知道了。
如果我今天重新开始,我将首先补充、积累HTML和CSS方面的知识。当我开始碰到一些我不太了解的新技术时,在准备用Objective-C实现之前,我会大概了解一下。
任何语言都可以起步
如果你真的不确定从哪里开始,或者你想开发什么,请不要因此受到影响。虽然我花时间学习Ruby和Python、还没有用它们完成任何项目,但是我不觉得时间被浪费了。
初学者通常的起点是学习HTML和CSS去开发网站。它们实际上是标记语言,如果你想开发移动或web app,貌似学习HTML和CSS是浪费时间。但是在这种情况下,你将获得知识和经验,对你继续学习编程语言是有帮助的。
如果你急切希望开始学习编程却不知道从哪儿开始,就挑一本书、教程或在线课程,只要你喜欢,就搞定它!一旦你对想开发的东西有了更好的理解,你总是可以选择学习一种不同的语言。
找到你真正关心的项目
对我而言,最大的学习曲线可能就是找到让我坚持学习代码的动机。过去我尝试了很多次:在我小时候学习HTML和CSS,几年后学习Ruby的基础知识,最近在学Python。
我决定学习Objective-C,不是因为它胜过了Ruby或Python我才喜欢,也不是因为我认识学Objective-C的人,只是因为我有一个iOS app的想法清单,我想完成——我真的想去开发。
我学习Objective-C的动机比以前学习任何其它语言都要强烈,因为我想开发的私人项目在鼓励着我。
最重要的是,随着难度加大,我感到沮丧、遇到困难时,我没有放弃——因为我正在开发我真正关心的项目。每次我设法实现一些新功能,运行良好,得到的收获甚至更好了,因为它是我有激情的项目的一部分。
如果你正在考虑学习编程,而你没有选择语言或平台的任何限制,我明确建议选择你真正有激情的项目,这样才能为项目需要所选择的语言打下基础。
每个人的学习方法都不同,因此你可能有着与我不同的经历,不过如果你只是刚起步、或在考虑学习编程的事情,那么希望我的经验和错误能帮你学得更快。
【ios个人总结学习】推荐阅读:
小挂职学习个人总结总结06-29
个人德育学习总结06-02
个人总结学习状况07-05
团校学习个人总结07-28
个人学习教育总结09-12
中专学习个人总结09-20
英语学习个人总结_英语学习总结06-27
党课学习小组个人总结06-01
党校学习个人思想总结06-04
教师个人自我学习总结07-28