iOS应用开发基础(二)基础知识

来源:互联网 发布:淘宝发布宝贝数量 编辑:程序博客网 时间:2024/05/18 15:51

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


工具:

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

UIViewControl之间的七种传值方式


第一种直接传值(正向传值):在两个UIViewControl中,都有属性NSstring属性,(copy),每次想传值的时候,创建另一个Control,设置属性,然后presentController:annimated:compiletion:
第二种(反向传值):利用委托来传值;
第三种(反向传值):利用消息中心:发送方创建NSNotification,利用NSNotificationCenter的postNotificaiton来发送消息;然后接收方利用NSNotificaitonCenter来接受消息;
第四种:使用全局单例模式传值
第五种:利用AppDelegate的view的viewWithTag:来获取全部控件内容,从而进行传值

多点触摸和手势监测:


1.响应者链:
只要继承了UIResponder对象就可以作为事件的响应者,UIControl继承了UIView,UIView又继承了UIResponder。事件先发给第一响应者(也就是触摸屏的控件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:每次都需要初始化不同的数据使用

本博客主要来自对《疯狂iOS讲义》、《iOS编程(第四版)》的总结。如有不不同见解,请留言交流。

0 0
原创粉丝点击