本文可能涉及很多零碎的知识点,其中包括IOS应用开发的相关基础知识。以后会针对每个条目在进行深入研究,这里只是先做一个相关知识的概述总结。


工具:


dash可以离线查看开发者文档、SDK Guide、Simple Code等参考资料,是很好的工具。




UIViewControl之间的七种传值方式




第一种直接传值(正向传值):在两个UIViewControl中,都有属性NSstring属性,(copy),每次想传值的时候,创建另一个Control,设置属性,然后presentController:annimated:compiletion:


第二种(反向传值):利用委托来传值;


第三种(反向传值):利用消息中心:发送方创建NSNotification,利用NSNotificationCenter的postNotificaiton来发送消息;然后接收方利用NSNotificaitonCenter来接受消息;


第四种:使用全局单例模式传值


第五种:利用AppDelegate的view的viewWithTag:来获取全部控件内容,从而进行传值



多点触摸和手势监测:






1.响应者链:



事件先发给第一响应者(也就是触摸屏的控件UIView控件或者UIView的子控件),如果不存在则会传入对象的视图控制器,,如果视图控制器不处理,则会传给父的UIview控件,,如果不处理,则会传给父的控制器,……直到顶层的视图控制器,如果接下来还没有处理,就会传到应用程序窗口UIWindow,如果还不处理,则会传给UIApplication(也继承了UIResponder),如果还不处理,则传给应用程序委托对象。






2.手势处理器:可以面向UIGestureRecognizer编程,UIGestureRecognizer提供了如下子类:



UITapGestureRecognizer 点击手势控制器



UIPinchGestureRecognizer 捏合手势处理器



UIRotationGestureRecognizer 用户旋转手势处理器



UISwipeGestureRecognizer 用户滑动手势处理器



UIPanGestureRecognizer 用户拖动手势处理器



UIScreenEdgePanGestureRecognizer



UILongPressGestureRecognizer 长按手势处理器






3.自定义手势处理器:主要实现UIGestureRecognizerde 的几个方法



-touchesBegan:withEvent:



-touchesMoved:withEvent:



-touchesEnded:withEvent:



-touchesCancelled:withEvent:等几个函数……





图形、图像和动画






1.基础库:



基础:quartz2d,对于自定义控件有很好的帮助;



高级:cocos2d 游戏图形图像库



动画:Core Animation、CALayer执行动画



图像处理:Core Image框架对图片执行去尘、扭曲、调整色彩等各种效果;





2.Quartz 2D绘图:关键步骤为两步:获取CGContextReft;调用CGContextRef的方法进行绘图。



获取CGContextRef的不同方式:



1.自定义UIView时获取CGContextRef;



开发自定义UIView的方法是:继承UIView的子类,并重写该UIView的drawRect:方法,在调用drawRect:方法之前,系统会自动配置绘图环境,因此,可以通过如下函数获取:CGContextRef ctx = UIGraphicsGetCurrentContext();



2.创建位图时,获取CGContextRef;



程序先要调用UIGraphicsBeginImageContext()函数来创建内存中的图片。然后才能调用UIGraphicsGetCurrentContext()获取绘图的CGContextRef





3.Quartz 2D绘图的核心API:CGContextRef,该API并不是一个对象,Quartz 2D本身不是面相对象的,是面相过程的,所以提供了大量函数来完成绘图。



CGPathRef代表任意多条直线或者曲线连接而成的任意图形,当CGContextRef根据CGPathRef绘制时,它可以绘制出任意形状。



一般具有以下功能:



1.绘制几何图形;



2.点线模式;CGContextSetLineDash(CGContextRef c, CGFloat phase, const CGFloat lenghts[], size_t count)第三个参数是点线模式的关键,该参数是一个CGFloat型数组,{5,3,1,2}代表长度5,距离3,长度1,间距2,长度5,间距3……的点线模式;



3.绘制文本:CGContextShowText(CGContextRef c , CGFloat x, CGFloat y, const char *string, size_t length):控制CGContextRef在制定绘制点绘制制定文本。此外系统还为NSString提供了一个UIStringDrawing分类,通过该分类为NSString增加了drawAtPoint:withAttributtes:,drawInRect:withAttributes等绘制方法,



绘制文本的一般步骤:



1.获取绘图的CGContextRef.



2.设置绘制文本的相关属性,例如绘制方式、字体大小、字体名称。



3.绘制不需要进行变换的文本,直接调用NSString的drawAtPoint:withAttributtes。drawInRect:withAttributes等绘制方法





4.设置阴影;






5.使用路径;






6.绘制曲线;






7.在内存中绘图:前面介绍的通过扩展UIView、重写drawRect方法进行绘图,这种绘图方式是直接在UIView控件上绘制所有图形的,这意味着每次控件显示时,都要绘制所有图形,这种性能方面并不好。有时候需要在内存方面绘制图片,这样既可以导出到手机本地,也可以穿到网络上。



在内存中绘制绘图有以下几个步骤:



1.UIGraphicsBeginImageContext(CGSize size);准备绘图环境;



2.UIGraphicsGetCurrentContext()函数获取绘图CGContextRef;



3.从前面介绍的绘制集合图形、使用路径等方式进行绘图;



4.调用UIGraphicsGetImageFromCurrentImageContext()函数来获取但前绘制的图形,该方法返回一个UImage对象。



5.调用UIGraphicsEndImageContext()函数来结束绘图,并关闭绘图环境。





8.还有其他图形变换,填充模式,动画等;






Rect中点的概念不是像素,



在Retina屏幕中一个点是高和宽都是两个像素;



在非Retina屏幕中一个点是高和宽都是一个像素。在iphone4之后,应该都是采用Retina屏幕。





在drawRect中自定义绘图:



bounds表示矩形位于自己的坐标系;



Frame表示矩形位于父窗口的坐标



例如把UIwindow的bounds付给firstView,这样第一个视图就充满了整个屏幕。





Core Graphics:是一套C语言的绘画库。iOS封装了该库。如果想实现渐变等复杂效果,仍需要使用Core Graphics库来实现。



该库有Ref结尾,因为ARC机制不能识别该类强引用和对象的所有权,所以必须要手动释放。



UIBezierPath来绘制直线和曲线(使用路径绘制)



改变画笔的颜色是通过UIColor的setStroke函数来实现。





视图控制器中视图的初始化:



1.在UIViewController中的loadView函数;Controller在创建的时候view是nil,但是如果在显示的时候仍然是nil,那么就会调用loadView函数来初始化view。该视图一般都是weak引用,因为在内存减少的情况下,会自动释放,然后再需要的时候在创建。



2.使用NIB方式,创建所需的视图层次结构,然后加载。



如果视图控制器不显示的调用initWithNib:bundle方法来加载Nib文件,那么程序会找与Controller同名的.xib文件来加载。



为了实现视图的延迟加载,在initWithNibName:bundle中不应该访问任何view和view的子视图。相关初始化代码都想改在viewDidView中实现,避免加载不显示view;



viewDidLoad:设置一次视图



viewWillAppear:每次都需要初始化不同的数据使用