Quartz 2D基本图形的绘制
基本步骤:
1.获取绘图上下文
2.创建并设置路径
3.将路径添加到上下文
4.设置上下文状态
5.绘制路径
6.释放路径
#import "YGView.h"
//屏幕尺寸#define kScreenSize [UIScreen mainScreen].bounds.size
//屏幕宽高定义
#define kscreenWidth [[UIScreen mainScreen] bounds].size.width
#define kScreenHeight [[UIScreen mainScreen] bounds].size.height
@implementation YGView
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context=UIGraphicsGetCurrentContext();
// [self drawLine1:context];
// [self drawLine2:context];
// [self drawArc:context];
// [self drawCurve:context];
// [self drawImage:context];
// [self drawImageChangeContext:context];
[self drawImage1:context];
}
-(void)drawLine1:(CGContextRef)context{
CGMutablePathRef path=CGPathCreateMutable();
CGPathMoveToPoint(path, nil, 20, 50);//移动到指定位置(设置路径起点)
CGPathAddLineToPoint(path, nil, 20, 100);//绘制直线(从起始位置开始)
CGPathAddLineToPoint(path, nil, 200, 100);//绘制另一条直线(从上一条直线的终点开始)
CGContextAddPath(context, path);
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);//设置直线颜色
CGContextSetRGBFillColor(context, 0, 1.0, 0, 1);//设置填充颜色
CGContextSetLineWidth(context, 2.0);//设置直线宽度
CGContextSetLineCap(context, kCGLineCapRound);//设置顶点样式
CGContextSetLineJoin(context, kCGLineJoinRound);//设置连接点样式
CGFloat lengths[2]={18,9};
CGContextSetLineDash(context, 0, lengths, 2);
CGContextDrawPath(context, kCGPathFillStroke);//最后一个参数是填充类型
/*CGPathDrawingMode是填充方式,枚举类型
kCGPathFill:只有填充(非零缠绕数填充),不绘制边框
kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)
kCGPathStroke:只有边框
kCGPathFillStroke:既有边框又有填充
kCGPathEOFillStroke:奇偶填充并绘制边框
*/
CGPathRelease(path);
}
-(void)drawLine2:(CGContextRef)context{
CGContextMoveToPoint(context, 20, 150);
CGContextAddLineToPoint(context, 20, 200);
CGContextAddLineToPoint(context, 200, 200);
//封闭路径
CGContextClosePath(context);
[[UIColor redColor] setStroke];//设置红色边框
[[UIColor greenColor] setFill];//设置填充颜色
//[[UIColor blueColor]set];//同时设置填充和边框色
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark 绘制矩形
-(void)drawRectWithContext:(CGContextRef)context{
//添加矩形对象
CGRect rect=CGRectMake(20, 50, 280.0, 50.0);
CGContextAddRect(context,rect);
//设置属性
[[UIColor blueColor]set];
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制椭圆
-(void)drawEllipse:(CGContextRef)context{
CGRect rect=CGRectMake(50, 50, 220, 200);
CGContextAddEllipseInRect(context, rect);
//设置属性
[[UIColor greenColor] set];
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制弧线
-(void)drawArc:(CGContextRef)context{
// CGContextAddArc(CGContextRef _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
/* 添加弧线对象
x:中心点x坐标
y:中心点y坐标
radius:半径
startAngle:起始弧度
endAngle:终止弧度
clockwise:是否逆时针绘制,0为顺时针绘制
*/
CGContextAddArc(context, 160, 160, 100, 0, M_PI*0.2, 0);
//设置属性
[[UIColor redColor] setStroke];
[[UIColor yellowColor] setFill];
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制贝塞尔曲线
-(void)drawCurve:(CGContextRef)context{
CGContextMoveToPoint(context, 20, 100);
// CGContextAddQuadCurveToPoint(CGContextRef _Nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)
/*绘制二次贝塞尔曲线
c:图形上下文
cpx:控制点x坐标
cpy:控制点y坐标
x:结束点x坐标
y:结束点y坐标
*/
CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100);
CGContextMoveToPoint(context, 20, 500);
// CGContextAddCurveToPoint(CGContextRef _Nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)
/*绘制三次贝塞尔曲线
c:图形上下文
cp1x:第一个控制点x坐标
cp1y:第一个控制点y坐标
cp2x:第二个控制点x坐标
cp2y:第二个控制点y坐标
x:结束点x坐标
y:结束点y坐标
*/
CGContextAddCurveToPoint(context, 80, 300, 240, 500, 300, 300);
//设置图形上下文属性
[[UIColor yellowColor]setFill];
[[UIColor redColor]setStroke];
//绘制路径
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 图像绘制
-(void)drawImage:(CGContextRef)context{
UIImage *image=[UIImage imageNamed:@"test1"];
//从某一点开始绘制
// [image drawAtPoint:CGPointMake(10, 50)];
//绘制到指定的矩形中,注意如果大小不合适会会进行拉伸
[image drawInRect:CGRectMake(20, 20, 300, 300)];
//平铺绘制
// [image drawAsPatternInRect:CGRectMake(20, 20, 300, 300)];
}
#pragma mark - 图形上下文变换
-(void)drawImageChangeContext:(CGContextRef)context{
//保存初始状态
CGContextSaveGState(context);
//1.图形上下文向右平移40
CGContextTranslateCTM(context, 60, 40);
//2.缩放0.5
CGContextScaleCTM(context, 0.5, 0.5);
//3.旋转
CGContextRotateCTM(context, M_PI_4/4);
UIImage *image=[UIImage imageNamed:@"test1"];
[image drawInRect:CGRectMake(20, 50, 300, 300)];
//恢复到初始化状态
CGContextRestoreGState(context);
}
#pragma mark - 使用Core Graphics绘制图像
-(void)drawImage1:(CGContextRef)context{
// UIImage *image=[UIImage imageNamed:@"test1"];
// //图像绘制
// CGRect rect=CGRectMake(20, 50, 300, 300);
// CGContextDrawImage(context, rect, image.CGImage);
// ///以上代码图像会倒过来
UIImage *image=[UIImage imageNamed:@"test1"];
CGContextSaveGState(context);
CGFloat height=300,y=50;
//上下文形变
CGContextScaleCTM(context, 1, -1);//在Y轴缩放-1相当于沿着X轴旋转180度;注意不要沿着z轴旋转,这样得不到想要的结果
CGContextTranslateCTM(context, 0, -(kScreenHeight-(kScreenHeight-height-2*y)));//向上平移
//图像绘制
CGRect rect=CGRectMake(10, y, 300, height);
CGContextDrawImage(context, rect, image.CGImage);
CGContextRestoreGState(context);
}
@end
相关文章:

命令行程序增加 GUI 外壳
Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 GUI 外壳的命令行程序 程序思路是这样的: 通过运行 cmd.exe 来操作命令行,…

人月神话阅读笔记07
第1章 焦油坑焦油坑的意思说明了即使你足够强大,也无法摆脱束搏而沉到坑底。IT项目也是这样,不论是开发大型软件系统还是小型项目,都会遇到诸多复杂的问题和影响因素,项目本身就是一个足够复杂的动态系统,没有最优&…

区块链隐私:交易还是计算?
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链隐私:交易还是计算? 隐私”是什么意思?在区块链生态系统中,“隐私”这个词被用于许多不同的语…

8 ServletContext
1 为什么需要ServletContext 技术 显示网站多少人在线,显示当前登录者是第几位登录者等信息。 2 什么是ServletContext 可以把它想象成一个服务器上的公共空间,每个用户都可以访问到它。 Web 容器在启动时,它会为每个Web 应用程序都创建一个对…

IOS沙盒Files目录说明和常用操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 读取Documents目录代码 NSArray *pathsDocumentsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *pathDocu…

iOS一些实用的技巧
获取触摸的点- (CGPoint)locationInView:(UIView *)view; - (CGPoint)previousLocationInView:(UIView *)view;自动适应父视图大小self.view.autoresizesSubviews YES;self.view.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;把pli…

在公共区块链中通过加密保护数据
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 隐私限制 在处理或交换业务文件时,贸易伙伴可能需要某些隐私因素。 (1)交易数据的隐私性: 交易数据仅供交易双方阅读。 (2)交…

python xml模块学习
xml打开方式 # xml有两种打开方式 # 1. 打开文件,读取XML内容 str_xml open(xman.xml, r).read() print(str_xml)# 将字符串解析成xml特殊对象,root代指xml文件的根节点 root ET.XML(str_xml) # 读取字符串,将字符串转为Element对象 pri…

实例 - 购物车 (列表、循环)
salary int(input(Please input your money:))product [(iphone6s,5800),(mac bood,9000),(coffee,32),(python book,80),(bicyle,1500), ]shopping []while True:#打印商品内容n 1for i,v in product:print(n,.,i,v)n 1#引导用户选择商品choice input(选择购买商品编号:…

右滑手势导航返回的相关设置
iOS7之后提供了右滑返回上一级界面的手势,但是自定义返回按钮会失效,解决办法如下: -(void)viewWillAppear:(BOOL)animated{ [superviewWillAppear:animated]; if([self.navigationController respondsToSelector:selector(interacti…

区块链编程完全指南:平台、语言与结论
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链,代表着未来的发展方向。是的,在文章开头,我们首先给出这样的结论。当然,认定未来将围…

基于QProbe创建基本Android图像处理框架
先来看一个GIF 这个GIF中有以下几个值得注意的地方这个界面是基本的主要界面所应该在的地方。其右下角有一个“”号,点击后,打开图像采集界面在这个界面最上面的地方,显示的是当前图像处理的状态。(一般来说,是成功/不…

iOS三种拨打电话的方法
1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示NSMutableString* str[[ NSMutableStringalloc ] initWithFormat : "tel:%" , "xxxxxxxxxxx" ];[[UIApplica…

查询今天是周几?
<?php $wdate(w); $weekarray( "0">"星期日", "1">"星期一", "2">"星期二", "3">"星期三", "4">"星期四", "5">"星期五",…

区块链学习之-发布合约
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 命令行编译,发布合约1. 编译合约,编译不了curl --data ‘{“jsonrpc”:“2.0”,“method”: “eth_compileSolidi…

Codeforces 900D Unusual Sequences:记忆化搜索
题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) x 且 ∑(a[i]) y。 题解: 由于gcd(a[i]) x,所以y一定是x的倍数,否则无解。 那么原题就等价于…

对AFNetworking的简单封装
#import "YGLoadDataManager.h"#import "AFNetworking.h"implementation YGLoadDataManager#pragma mark -- GET请求 -- (void)getWithURLString:(NSString *)URLStringparameters:(id)parameterssuccess:(void (^)(id))successfailure:(void (^)(NSError …

js原型链prototype与__proto__以及new表达式
对象模型的细节 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model转载于:https://www.cnblogs.com/imust2008/p/5621751.html

公有链和联盟链的本质不同
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链是生命体、经济体。未来的区块链世界离不开自己的价值尺度建设 公有链和联盟链的本质不同 区块链受到大家广泛关注应该是2015年10月…

C++ 重载运算符简单举例
我们可以重定义或重载大部分 C 内置的运算符。这样,就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。…

ApacheBench(ab)使用详解
ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目…

ios如何实现静音模式下声音仍然可以外放
AVAudioSession *audioSession [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

创建数据目录及多节点目录
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 创建数据目录及多节点目录 mkdir -p ~/workmeta/EduEthereumServerDeploy/deploy_2/{node1,node2} > cd ~/workmeta/EduEthereumServerD…

卷积神经网络学习笔记与心得(4)池化
图片经过卷积、激活后的结果一般带有大量原图信息。 上图中卷积核提取的是竖直方向上的连续像素,但是,被增强的像素只占了结果的1/3,对于多层网络,其余重要性较低的信息也被传入了下一层网络,造成了不必要的浪费&#…

mina、netty消息边界问题(采用换行符)
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总…

关于延时操作的使用
延时操作主要有4种方式 1.sleep方式 [NSThread sleepForTimeInterval:1.0f]; [self delayMethod]; 使用sleep方式在主线程和子线程中均可执行,但是这是中阻塞线程的方式,所以建议放到子线程中使用,以免卡住主线程使界面卡住. 没有发现取消执行的方法. 2.NSTimer定时器方式 …

CGpoint,CGSize,CGRect,NSRange
NSRange (范围);(location,位置 length,长度; NSPoint /CGpoint(点); NSSize /CGSize(大小) CGPoint p1 CGPointZero CGPointMake(0, 0)代表原点 CGSizeZero CGSizeMake(0, 0);代表大小为0 CGRect rec CGRectMake…

Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从…

WebViewJavascriptBridge的简单使用
- (void)viewDidLoad { UIWebView* webView [[UIWebView alloc] initWithFrame:self.view.bounds]; webView.backgroundColor [UIColor whiteColor]; [self.view addSubview:webView]; // 打开输出日志[WebViewJavascriptBridge enableLogging]; // 设置关联…

区块链架构详解
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 准备工作 区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特…