CoreGpaphics
CoreGpaphics基本应用
CGAffineTransformMake开头的函数 是基于最初始的位置来变化的
带有CGAffineTransform参数是基于CGAffineTransform的位置变化的
CGAffineTransformIdentify就是原来没有变化前的位置
主要函数有:
CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return the transform [ a b c d tx ty ]. */ CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which translates by `(tx, ty)':
t' = [ 1 0 0 1 tx ty ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which scales by `(sx, sy)':
t' = [ sx 0 0 sy 0 0 ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which rotates by `angle' radians:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return true if `t' is the identity transform, false otherwise. */ CG_EXTERN bool CGAffineTransformIsIdentity(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); /* Translate `t' by `(tx, ty)' and return the result:
t' = [ 1 0 0 1 tx ty ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Scale `t' by `(sx, sy)' and return the result:
t' = [ sx 0 0 sy 0 0 ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Rotate `t' by `angle' radians and return the result:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Invert `t' and return the result. If `t' has zero determinant, then `t'
is returned unchanged. */ CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
重写drawRect 只能写在所有视图的父类 UIView,
UIImageView等视图是不允许重写的
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:50 startAngle:0 endAngle:2 * M_PI clockwise:YES];
CAShapeLayer *caShapeLayer = [CAShapeLayer layer];
caShapeLayer.path = bezierPath.CGPath;
caShapeLayer.fillColor = [UIColor redColor].CGColor;
[self.layer addSublayer:caShapeLayer];
NSString *attrString =@"hellohellohellohellohellohellohellohellohello";
UIColor *stringColor = [UIColor colorWithRed:1.0 green:0.0f blue:0 alpha:1.0]; //设置文本的颜色
NSDictionary* attrs =@{NSForegroundColorAttributeName:stringColor,
NSFontAttributeName:[UIFont fontWithName:@"AmericanTypewriter"size:18],
}; //在词典中加入文本的颜色 字体 大小
[attrString drawInRect:CGRectMake(0,0,50,50)withAttributes:attrs]; //给文本限制个矩形边界,防止矩形拉伸;
NSString *s = @"我的小狗";
[s drawAtPoint:CGPointMake(100, 0) withFont:[UIFont systemFontOfSize:34.0]];
}
CGContextRef context= UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(context, CGRectMake(10, 100, 300, 280));
CGContextSetFillColorWithColor(context, [UIColor orangeColor].CGColor);
CGContextFillPath(context); CGRect rectangle = CGRectMake(100, 290, 100, 25);
CGContextAddRect(context, rectangle);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillPath(context); CGContextBeginPath(context);
CGContextMoveToPoint(context, 160, 220);
CGContextAddLineToPoint(context, 190, 260);
CGContextAddLineToPoint(context, 130, 260);
CGContextClosePath(context);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillPath(context); CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextAddArc(context, 120, 170, 25, 0 * M_PI, 2 * M_PI, YES);
CGContextFillPath(context); CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextAddArc(context, 200, 170, 25, 0 * M_PI, 2 * M_PI, YES);
CGContextFillPath(context); CGContextBeginPath(context);
CGContextMoveToPoint(context, 160, 100);
CGContextAddQuadCurveToPoint(context, 160, 50, 190, 50);
CGContextSetLineCap(context, kCGLineCapSquare);
CGContextSetLineWidth(context, 20);
CGContextStrokePath(context);
CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
CGContextClosePath(context);
画图动画:
UIBezierPath *topBezierPath = [UIBezierPath bezierPath];
[topBezierPath moveToPoint:CGPointMake(160, 100)];
[topBezierPath addQuadCurveToPoint:CGPointMake(190,50) controlPoint:CGPointMake(160, 50)];
topBezierPath.lineCapStyle = kCGLineCapSquare;
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = topBezierPath.CGPath;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor brownColor].CGColor;
shapeLayer.lineWidth = 20; CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
theAnimation.delegate = self;
theAnimation.duration = 2;
theAnimation.removedOnCompletion = FALSE;
theAnimation.fromValue = [NSNumber numberWithFloat:0];
theAnimation.toValue = [NSNumber numberWithFloat:2];
[shapeLayer addAnimation:theAnimation forKey:@"animateLayer"]; [self.layer addSublayer:shapeLayer];
白板画图:
通过一个简单的画板(白板)来熟悉 Quartz 2D绘图
添加一个Empty Application,新建一个UIView类
在AppDelegate中修改代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
//创建View,并指定View的大小为全屏
WhiteBoardView *whiteView = [[WhiteBoardView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.window addSubview:whiteView];//把创建的View作为子视图加入窗口
[whiteView release];
[self.window makeKeyAndVisible];
return YES;
}

修改UIView类中代码:

// WhiteBoardView.h
// DrawingBoard
#import <UIKit/UIKit.h>
@interface WhiteBoardView : UIView{
CGContextRef whiteBoardContext;
CGLayerRef whiteBoardLayer;
}

@end
实现类:

// WhiteBoardView.m
// DrawingBoard
#import "WhiteBoardView.h"
@implementation WhiteBoardView
//对进行重写,以便在视图初始化的时候创建并设置自定义的Context
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];//指定视图的背景色
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //指定色彩空间为RGB
//创建Bitmap Context,大小为View自身的大小
whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8,
4 *self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace) ;
//创建新的CGLayer,用于画图
whiteBoardLayer = CGLayerCreateWithContext(whiteBoardContext, self.frame.size, NULL);
//得到新建层的Context
CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
//指定新建层Context的线宽
CGContextSetLineWidth(layerContext, 1.5);
CGContextSetLineCap(layerContext, kCGLineCapRound); //指定线头形状为圆形
CGContextSetRGBStrokeColor(layerContext, 0.0,0.0,0.0,1);//指定线的颜色,黑色
}
return self;
}
//对drawRect进行重写
- (void)drawRect:(CGRect)rect
{
//先得到当前的Context
CGContextRef currentContext = UIGraphicsGetCurrentContext();
//根据Context的内容生成Bitmap
CGImageRef image = CGBitmapContextCreateImage(whiteBoardContext);
//把Bitmap绘制到Context上
CGContextDrawImage(currentContext, [self bounds], image);
//把whiteBoardLayer也绘到当前Context中
CGContextDrawLayerInRect(currentContext , [self bounds], whiteBoardLayer);
}
//屏幕触摸事件 触摸开始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *theTouch = [touches anyObject];//先得到touch对象
if ([theTouch tapCount] == 2)//判断是否为双击,是就清空图像
{
CGContextClearRect(whiteBoardContext, [self bounds]);//清空
[self setNeedsDisplay]; //刷新屏幕显示
}
else//如果不是双击,就按手指划动处理,结果是画出一个点
{
[self touchesMoved:touches withEvent:event];
}
}
//手指划动时画线的代码
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *theTouch = [touches anyObject];
//得到当前位置
CGPoint currentTouchLocation = [theTouch locationInView:self];
//得到上次位置
CGPoint lastTouchLoacation = [theTouch previousLocationInView:self];
//取得Context
CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
//开始定义Path
CGContextBeginPath(layerContext);
//把Path的起点移动到上次位置
CGContextMoveToPoint(layerContext, lastTouchLoacation.x, lastTouchLoacation.y);
//在上次位置和当前位置之间连线,并记入Path
CGContextAddLineToPoint(layerContext, currentTouchLocation.x, currentTouchLocation.y);
//沿Path画线
CGContextStrokePath(layerContext);
[self setNeedsDisplay]; //刷新屏幕
}
- (void)dealloc
{
CGContextRelease(whiteBoardContext);
CGLayerRelease(whiteBoardLayer);
[super dealloc];
}

@end

3.OpenGL ES编程
一般是三个步骤:
(1)在Context中绘图
(2)把Context中的内容送入framebuffer
(3)显示framebuffer
二.CGPath的使用
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGPathMoveToPoint(mutablePathRef, NULL, , );
//(10, 10) 起点, (50, 100) 中点, (100, 10)终点
CGPathAddCurveToPoint(mutablePathRef, NULL, , , , , , );
CGContextAddPath(contextRef, mutablePathRef);
CGContextSetStrokeColorWithColor(contextRef, [UIColor redColor].CGColor);
CGContextSetLineWidth(contextRef, );
CGContextDrawPath(contextRef, kCGPathFillStroke);
CoreGpaphics的更多相关文章
随机推荐
- Mongdb和Spring的整合
我自己的实现: 代码:https://github.com/littlecarzz/spring-data-mongodb 我使用的是spring-data-mongodb包,因为springboot ...
- Google的JSON风格指南
官网:https://google.github.io/styleguide/jsoncstyleguide.xml 中文版:https://github.com/darcyliu/google-st ...
- Java教程收集
极客学院Wiki离线教程-Java类: 官网:http://wiki.jikexueyuan.com/list/java/ 离线版本:链接:http://pan.baidu.com/s/1pKD2oH ...
- 前端MVC Vue2学习总结(九)——Vuex状态管理插件
一.概要 1.1.Vuex定义与注意事项 Vuex是为vue.js框架更好的管理状态而设计一个插件.Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的 ...
- MD5加密算法Java代码
原文:http://www.open-open.com/code/view/1428398234916 import java.security.MessageDigest; import java. ...
- 深入GCD(五):资源竞争
概述我将分四步来带大家研究研究程序的并发计算.第一步是基本的串行程序,然后使用GCD把它并行计算化.如果你想顺着步骤来尝试这些程序的话,可以下载源码.注意,别运行imagegcd2.m,这是个反面教材 ...
- android中MVC,MVP和MVVM三种模式详解析
我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...
- webpack4.0入门以及使用
1. 安装webpack 先新建一个文件夹(demos),然后 npm init -y 新建一个package.json然后在当前目录执行webpack命令 webpack 模块未发现或者未找到src ...
- k进制正整数的对k-1取余与按位取余
华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/8/24 先说一下结论 有k进制数abcd,有abcd%(k−1)=(a+b+c+d)%(k−1) 这是由于kn=((k−1)+1)n=∑ ...
- AVL树,红黑树,B-B+树,Trie树原理和应用
前言:本文章来源于我在知乎上回答的一个问题 AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中? 看完后您可能会了解到这些数据结构大致的原理及为什么用在这些场景,文章并不涉及具体操作 ...