iOS之Drawing<2>
来源:互联网 发布:武汉育才行知小学校歌 编辑:程序博客网 时间:2024/05/16 13:03
图形上下文(Graphics Contexts)
我们可以使用代码来创建图画,图形上下文是可以绘画的地方。这里推荐两种获取图形上下文的方法:
- 创建一个图片上下文(image context)
函数UIGraphicsBeginImageContextWithOptions
用来创建一个图形上下文,接着你可以在上面绘制来产生图片,然后通过UIGraphicsGetImageFromCurrentImageContext
来将上下文转变为UIImage,最后使用UIGraphicsEndImageContext
关闭上下文。 - Cocoa交给你一个图形上下文(graphics context)
子类化UIView,然后实现drawRect:
。在drawRect:
被调用时,Cocoa已经创建了一个图形上下文,你在上面绘制什么,UIView就展示什么。
进一步,注意当前图形上下文:
UIGraphicsBeginImageContextWithOptions
函数不仅仅创建一个图片上下文,它也会让刚创建的上下文成为当前的图形上下文。drawRect:
被调用的时候,UIView的绘图上下文已经是当前的图形上下文了。- 带有
context:
参数的回调并没让任何一个上下文成为当前的图形上下文。这个参数是图形上下文的引用,你将会在上面绘制图形,所以你要确保让它成为当前的上下文。
有两种工具可以绘制图形:
UIKit
:
许多Cocoa类都知道如何绘制自己,包括UIImage,NSString(绘制文本),UIBezierPath(绘制形状),和UIColor。一些类提供便利方法,但是能力有限;其它类是相当强大的。
如果是通过context:
参数传入图形上下文的话,你可以通过UIGraphicsPushContext
方法来使传进来的上下文成为当前上下文,确保稍后调用UIGraphicsPopContext
恢复到以前状态。
- Core Graphics
:
这是强大的绘图API。Core Graphics通常指的是Quartz或者Quartz 2D,是位于所有iOS绘图之下的绘图系统,UIKit也是建立在其之上,所以,它是底层的,由C函数组成的。
使用Core Graphics,你必须要声明一个绘图上下文(CGContext)来在上面绘图。如果是通过context:
参数传入的图形上下文的话,那个就是你要在上面绘图的上下文;但是在UIGraphicsBeginImageContextWithOptions
或者drawRect:
情况下,你没有对上下文的引用,为了使用Core Graphics,你必须要得到引用。因为你想要绘制的就是当前上下文,所以可以调用UIGraphicsGetCurrentContext
获得引用。
1.实现UIView子类的drawRect:方法,使用UIKit在当前上下文中进行绘图:
override func drawRect(rect: CGRect) { let p=UIBezierPath(ovalInRect: CGRectMake(0, 0, 100, 100)) UIColor.blueColor().setFill() p.fill() }
2.使用Core Graphics实现相同的事情:
override func drawRect(rect: CGRect) { let con=UIGraphicsGetCurrentContext()! CGContextAddEllipseInRect(con, CGRectMake(0, 0, 100, 100)) CGContextSetFillColorWithColor(con, UIColor.blueColor().CGColor) CGContextFillPath(con) }
3.实现UIView子类的drawLayer:inContext:方法,这种情况下,有一个上下文的引用,但它不是当前上下文,所以必须使它成为当前上下文来使用UIKit:
override func drawLayer(layer: CALayer, inContext ctx: CGContext) { UIGraphicsPushContext(ctx) let p=UIBezierPath(ovalInRect: CGRectMake(0, 0, 100, 100)) UIColor.redColor().setFill() p.fill() UIGraphicsPopContext() }
4.使用Core Graphics实现上面的效果:
``` override func drawLayer(layer: CALayer, inContext ctx: CGContext) { CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100)) CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor) CGContextFillPath(ctx) }
5.最后,来制作一个UIImage,我们可以在任何时候完成这个任务。产生的UIImage可以用在任何地方:
使用UIKit:
override func viewDidLoad() { super.viewDidLoad() let draw=UIImageView() draw.frame=CGRectMake(100, 100, 100, 100) UIGraphicsBeginImageContextWithOptions(CGSize(width: 100, height: 100), false, 1.0) let p=UIBezierPath(ovalInRect: CGRectMake(0, 0, 100, 100)) UIColor.blueColor().setFill() p.fill() let im:UIImage=UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() draw.image=im self.view.addSubview(draw) }
使用Core Graphics:
verride func viewDidLoad() { super.viewDidLoad() let draw=UIImageView() draw.frame=CGRectMake(100, 100, 100, 100) UIGraphicsBeginImageContextWithOptions(CGSize(width: 100, height: 100), false, 1.0) let con=UIGraphicsGetCurrentContext() CGContextAddEllipseInRect(con, CGRectMake(0, 0, 100, 100)) CGContextSetFillColorWithColor(con, UIColor.blueColor().CGColor) CGContextFillPath(con) let im:UIImage=UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() draw.image=im self.view.addSubview(draw) }
- iOS之Drawing<2>
- iOS之Drawing<1>
- IOS深入学习(5)之Drawing Model
- iOS Drawing Concepts
- iOS的Drawing
- iOS drawing 绘图简介
- iOS Drawing Performance
- iOS Drawing-Images
- System.Drawing之point
- IOS 深入学习(31)之About Drawing and Printing in iOS(绘图和打印)
- Smooth Freehand Drawing on iOS
- Drawing
- Advanced drawing in Quartz (iOS 4)
- 2D Drawing in OpenGL
- ios开发学习--绘图(Drawing)效果源码分享
- iOS Line drawing tool(画线类, 直线和 折线)
- iOS Line drawing tool(画线类, 直线和 折线)
- Core Graphics 学习笔记 之 Image Drawing(一)
- Objective-c 字符串处理
- 微信公众号开发之天气应用
- Swift——Command failed due to signal: Segmentation fault: 11
- sicily 1344. 数列
- ubuntu 解决 “E: Problem wih MergeList /var/lib/apt/lists/”错误
- iOS之Drawing<2>
- 2015年终总结,忙碌和无所事事的一年
- android高级控件ListView
- iOS 程序图标AppIcon和启动页面LaunchImage设置 —— HERO博客
- android传递数据bundle封装传递map对象
- 单例模式线程安全的实现方式
- opencv笔记 3.访问图像元素的四种方法
- Objective-数组操作
- ptlib编译时,会自动扫描电脑系统,找出头文件以及库文件并进行引用,生成头文件ptbuildopts.h