在cocoa touch 中一个应用程序是由多个窗口和视图构成。一个带有用户界面的应用程序至少包含一个窗口,同时可以包含一个或者多个视图。在cocoa Touch中,一个窗口是UIWindow的一个实例,通常,一个应用程序会打开主窗口,然后开发人员向窗口中添加各种视图:如按钮,标签,图像,或者自定义的控件。所有这些与UI相关的组件都由UIKit处理。
图形与动画:在IOS开发中 苹果公司向开发者提供了强大的框架来处理图形和动画,这些框架和技术有:
UIKit:cocoa touch 框架,高层次的框架,允许开发人员创建视图、窗口、按钮和其他UI组件。同时将一些低级别的api引入到易于使用的高级别API中。
Quartz 2D:IOS上绘图的主要引擎;UIKit上就使用Quartz。
Core Graphics:它支持图形上下文、加载图像、绘制图像,等等。
Core Animation 帮助开发者在IOS上实现动画的框架
不同的手机有不同的像素即使是屏幕一样大的手机像素也不一样,开发人员在开发的时候执行相同的代码却要考虑不同的屏幕尺寸和分辨率,为此苹果引入了设备独立的绘图方法。开发者使用相应的api,用点代替像素来代替大小。这样针对同屏幕大小不同像素的手机就可以使用同一份代码了。
view对象中最重要的方法之一是drawRect:。Cocoa Touch在需要绘制这个视图时会自动调用此方法,并通过这个方法要求视图对象在图形上下文中绘制它的内容,在这里图形上下文是Cocoa Touch自动准备的。可以认为图形上下文是一个画布,提供了大量的属性如画笔颜色、画笔粗细等。通过图形上下文,你可以在drawRect:方法里面进行任意的绘图。Cocoa Touch将确保图形上下文的属性应用到你的绘图上。
文本的绘制:
一、枚举 、加载字体 :字体是图形用户界面显示文本的基础。UIkit为开发者提供高层次ApI来枚举、加载和试用字体,Cocoa Touch 是用UIFont类来封装字体。每个ios设备都内置了系统字体。字体被组织成字体族科(Families),每个族科又包含字样(Faces)。
1、枚举字体族科:
- (void) enumerateFonts {
for (NSString *familyName in [UIFont familyNames]) {
NSLog(@"Font Family = %@", familyName);
}
}
枚举某个族科中的字体for(NSString *font in [UIFont fontNamesForFamilyName:familyName])
2、
加载字体到UIFont对象中:UIFont *font=[UIFont fontWithName:"HelveticaNeue-Bold" size:12.0f];还可以使用UIFont的实例方法 systemFontOfSize:(或者粗体版本 boldSystemFontOfSIze:)来加载当前设备本地系统字体,而不管它是什么,一般IOS设备默认的系统字体是:HelveTica。
二、开始绘制文本
NSString内建了一些便利方法可以绘制文本,如:drawAtPoint:withFont:
NSString中海油一个实例方法可以把文本绘制在一个矩形区域:[myString drawInRect:withFont]
三、颜色的构造、设置和使用
1、UIKit同时也提供高层次的抽象颜色,封装在对象UIColer对象中。我们可以使用类方法 [UIColor colorWithRed:Green:Blue:alpha:]创建一个UIColor对象来载入所需要的颜色。当拥有一个UIColor对象后我们可以使用UIColor的实例对象set来使当前的图形上下文在后续的绘图中使用该颜色。
2、UIColor 实际上是UIKit对Core Graphic中的CGColor 的一个包装类。当我们在Core Graphics这个较低的层次编程时,我们对于如何使用我们的颜色对象突然有了更多的控制,甚至可以检测颜色的组成部分,根据一个UIColor类型的对象检测其中红、绿、蓝、alpha成份:
a、使用UIColor类的实例方法CGColor实例方法,它会返回一个CGColorRef类型的颜色对象,这是一个Core Graphic Color Reference 对象。
b、使用CGColorGetComponents函数获取组成颜色对象的各个分量;
c、如果需要,使用CGColorGetNumberOfComponents函数来确定组成该颜色的颜色分量的数量(红+绿灯):
UIColor *myColor=[UIColor colorWithRed:0.6 Green:0.8 Blue:0.4:alpha:0.9];//创建UIColor对象来指定所需颜色
CGColorRef *cgColor=[myColor CGColor];//调用UIColor对象的实例方法CGColor 返回CGColorRef类型颜色对象,
const CGFloat *components=CGGolorGeComponents(cgColor);// 获取组成颜色对象的各个分量
NSUInteger componetsCount=CGColorGetNumberOfComponents(cgColor);//计算颜色分量的对象
NSUInteger count=0;
for(;count<componetsCount;count++){
NSLog(@"componts %lu = %.02f",(unsigned long)count+1,componets[count]);
}
图像的绘制:
一、同样的UIKit帮助你轻松地绘制图像。你所需要做的是把你的图像加载到UIImage类的实例中。UIImage提供了各种类方法和实例方法来加载你的图像
如:
imageNamed:类方法,加载和缓存图像 ; imageWithData:类方法,从一个NSData实例中加载图像,NSData实例封装了图像数据并作为参数传入此方法。
initWithContentsOfFile:实例方法(用于初始化)将传入的参数作为要载入图像的路径并用它初始化图像对象。initWithData:实例方法(用于初始化)使用传入的NSData类型的参数初始化图像。该数据应该是一个有效的图像。
二、UIImage类型图像绘制到图形上下文的两种方式:
drawAtPoint: ,UIImage类的实例方法按照图片的原始大小在给定的点位置图像,使用CGPointMake构造点。 drawInRect: UIImage类的实例方法,在给定的矩形区域绘制图像。矩形区域由函数CGRectMake构造。
线条的绘制:
路径是由屏幕上一个或一系列的点构成,路径可以包含许多线条,但线条不能包含许多路径,路径可以理解为一系列的点。
使用路径来绘制直线:
1.为图形上下文选择一个颜色
2.使用UIGraphicsGetCurrentContext函数获取图形的上下文的句柄
3.使用CGContextMoveToPoint 过程设置线条的起点;
4.使用CGContextAddLineToPoint过程在图形上下文移动你的笔画来指定线条的重点;
5.使用CGContextStrokePath过程创建你已经设定好的路径。此过程将使用图形上下文已经设置好的颜色来绘制路径。
构造路径:
一系列点放在一起,构成了一个形状。一系列形状放在一起,构成了一个路径。通过Core Graphics可以很容易地管理路径。路径属于正在绘制他们的图形上下文。
常用的函数:
CGPathCreateMutable 过程 :创建一个类型为CGMutablePathRef的可变路径,并返回其句柄。
CGPathMoveToPoint 过程:在路径上移动当前画笔的位置到一个点,这个点由CGPoing类型的参数指定
CGPathAddLineToPoint 过程:从当前的画笔位置向指定位置绘制线段。
CGContextAddPath过程:添加一个路径到图形上下文,准备用于绘图。
CGContextDrawPath过程:在图形上下文中绘制给出的路径。
CGPathRelease过程:释放为路径句柄分配的内存。
CGPathAddRect过程:向路径添加一个矩形。矩形的边界由一个CGRect结构体指定。
这里有三个重要的绘图方法,你可以让 CGContextDrawPath过程执行他们。
KCGPathStroke 使用当前选定的描边颜色为路径描边
KCGPathFill使用当前选定的填充颜色填充路径所包围的区域。
KCGPathFillStroke组合描边和填充
绘制矩形:
CGPathAddRect是Core Graphic中用于路径的过程之一,它可以让你把矩形作为路径的一部分来绘制。
为形状添加阴影:
使用core graphics 绘制阴影非常简单。图形上下文是支撑阴影的元素,这意味着你需要对上下文应用阴影、接着绘制需要阴影的形状,从后从上下文移除阴影。在Core Grahics中,我们可以使用下面两个过程 对图形上下文应用阴影:
CGContextSetShadow过程:
此过程将创建黑色或灰色阴影,它接受三个参数:
1.需要应用阴影的图形上下文。
2.偏移量,由CGSize类型的值指定。偏移量相对于将要应用阴影的形状的右边和底部,x偏移量越大,阴影更向形状的右边延伸。Y偏移量越大,阴影更向形状的底部延伸。
3.要应用到阴影的模糊值,它被指定为一个浮点值(CGFloat). 指定为0.0f将获得平整的阴影。这个值越高得到的阴影更加模糊。
CGContextSetShadowWithColor 过程:除了增加最后一个CGColorRef类型的参数用于设置阴影的颜色,其它参数上一个过程一模一样,
当阴影被设置后,如果不删除 阴影会应用到其它路径当中,为了避免这种情况发生,我们将在应用阴影之前保持图形上下文状态,然后在需要删除阴影效果时恢复原先的状态。一般来说,保存和恢复图形上下文状态并不只限于阴影。恢复图形上下文的状态会恢复一切(填充颜色、字体、线条粗细等)回到之前你为他们设置的值。通过CGContextSaveGState过程保存图形上下文的状态,通过CGContextRestoreGState过程恢复到以前的状态。
创建和绘制渐变:
Core Graphics允许开发者创建两种类型的渐变:线性的和径向的,线性渐变以某种颜色从一点开始,以另一种颜色在其它点结束。
为了创建一个线性渐变,你要调用CGGradientCreateWithColorComponents函数。这个函数的返回值是一个新的类型为CGGradientRef的渐变,这是一个句柄。一旦你不在使用渐变,你必须调用CGGradientRelease 过程,传入之前你从CGGradientCreateWithColorComponents获取到的渐变的句柄来释放资源。
CGCradientCreateWithColorComponents函数需要四个参数:
色彩空间:(Color Space)这是一个色彩范围的容器,类型必须是CGColorSpaceRef.对于这个参数,我们可以传入CGColorSpaceCreateDeviceRGB函数的返回值,它将给我们一个RGB色彩空间。
颜色分量的数组:这个数组必须包含CGFloat类型的红、绿、蓝和alpha值。数组中元素的数量和接下来两个参数密切。从本质来讲,你必须让这个数组包含足够的值,用来指定第四个参数中位置的数量。所以如果你需要两个位置位置(起点和终点),那么你必须为数组提供两种颜色
位置数组,颜色数组中各个颜色的位置:此参数控制该渐变从一种颜色过渡到另一种颜色的速度有多快。
位置的数量:这个参数指明了我们需要多少颜色和位置。
创建好线性渐变后,我们将使用CGContextDrawLinearGradient过程在图形上下文中绘制,此过程需要五个参数:
Graphics context 指定用于绘制线性渐变的图形上下文。Axial gradient 我们使用CGGradientCreateWithColorComponents函数创建的线性渐变对象的句柄
start point 图形上下文中的一个CGPoint类型的点,表示渐变的起点。End Point表示渐变的终点。 Gradient drawing options 当你的起点或者终点不在图形上下文的边缘内时,指定该如何处理。你可以使用你的开始或结束颜色来填充渐变以外的空间。此参数为以下值之一:KCGGradientDrawsAfterEndLocation扩展整个渐变到渐变的终点之后的所有点 KCGGradientDrawsBeforeStartLocation扩展整个渐变到渐变的起点之前的所有点。0不扩展该渐变。