iOS Quartz: CGPathAddArc和CGPathAddArcToPoint函数

CGPathAddArc函数是通过圆心和半径定义一个圆,然后通过两个弧度确定一个弧线。注意弧度是以当前坐标环境的X轴开始的。

需要注意的是由于iOS中的坐标体系是和Quartz坐标体系中Y轴相反的,所以iOS
UIView在做Quartz绘图时,Y轴已经做了Scale为-1的转换,因此造成CGPathAddArc函数最后一个是否是顺时针的参数结果正好是相反的,也就是说如果设置最后的参数为YES,根据参数定义应该是顺时针的,但实际绘图结果会是逆时针的!

比如,我们设置起点弧度为0,终点弧度为1.5 * PI(等于270角度),然后最后的clockwise参数为NO,代码:

CGPathAddArc(<#CGMutablePathRef path#>, <#const CGAffineTransform *m#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat radius#>, <#CGFloat startAngle#>, <#CGFloat endAngle#>, <#bool clockwise#>)

- (void)viewDidLoad

{

[super viewDidLoad];

//创建CGContextRef

UIGraphicsBeginImageContext(self.view.bounds.size);

CGContextRef gc = UIGraphicsGetCurrentContext();

//=== 绘画逻辑 ===

//创建用于转移坐标的Transform,这样我们不用按照实际显示做坐标计算

CGAffineTransform transform = CGAffineTransformMakeTranslation(50, 50);

//创建CGMutablePathRef

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddArc(path, &transform, 50, 50, 50, 0, 1.5 * M_PI, NO);

CGPathMoveToPoint(path, &transform, 50, 0);

CGPathAddLineToPoint(path, &transform, 50, 50);

CGPathAddLineToPoint(path, &transform, 100, 50);

//将CGMutablePathRef添加到当前Context内

CGContextAddPath(gc, path);

[[UIColor grayColor] setFill];

[[UIColor blueColor] setStroke];

CGContextSetLineWidth(gc, 2);

//执行绘画

CGContextDrawPath(gc, kCGPathFillStroke);

//从Context中获取图像,并显示在界面上

UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImageView *imgView = [[UIImageView alloc] initWithImage:img];

[self.view addSubview:imgView];

}

输出:

结果会是顺时针绘制弧线.

如果把CGPathAddArc函数改成这样:

//虽然顺时针参数是YES,在iOS中的UIView中,这里实际是逆时针。所以只会画出1/4。

CGPathAddArc(path, &transform, 50, 50, 50, 0, 1.5 * M_PI, YES);

虽然顺时针参数是YES,在iOS中,这里实际是逆时针。所以只会画出1/4。结果会是:

而CGContextAddArcToPoint函数则是另一种绘制弧线的方式,同样可以参考那个SO回答的截图.它是通过画两个虚拟的线来完成绘图的,这两条线是通过当前CGContextRef的点,和CGContextAddArcToPoint函数本身定义的两个点来完成的。而弧线会从当前CGContextRef的点开始,画到中心圆与第二条线的交点处。这样的画弧方式,在某些情况下可以使CGContextAddArcToPoint函数比CGPathAddArc用起来更加方便些。比如花圆角矩形。

//创建CGContextRef

UIGraphicsBeginImageContext(self.view.bounds.size);

CGContextRef gc =
UIGraphicsGetCurrentContext();

//===
绘画逻辑 ===

//创建用于转移坐标的Transform,如许我们不消遵守实际显示做坐标策画

CGAffineTransform transform =
CGAffineTransformMakeTranslation(100,200);

//创建CGMutablePathRef

CGMutablePathRef path =
CGPathCreateMutable();

//半径为30

CGFloat radius =
10;

//初始点为(0, 0)

CGPathMoveToPoint(path, &transform,
10, 0);

//右上角和右下角两个点,画出半个圆角

CGPathAddArcToPoint(path, &transform,
100, 0, 100,
100, radius);

//右下角和左下角两个点,画出别的半个圆角

CGPathAddArcToPoint(path, &transform,
100, 100, 0,
100, radius);

CGPathAddArcToPoint(path, &transform,
0, 100, 0,
0, radius);

CGPathAddArcToPoint(path, &transform,
0, 0, 100,
0, radius);

//将CGMutablePathRef添加到当前Context内

CGContextAddPath(gc, path);

[[UIColor
grayColor] setFill];

[[UIColor
blueColor] setStroke];

CGContextSetLineWidth(gc,
2);

//履行绘画

CGContextDrawPath(gc,
kCGPathFillStroke);

//从Context中获取图像,并显示在界面上

UIImage *img =
UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImageView *imgView = [[UIImageView
alloc] initWithImage:img];

[self.view
addSubview:imgView];

如下图说:

时间: 2024-10-08 13:54:18

iOS Quartz: CGPathAddArc和CGPathAddArcToPoint函数的相关文章

ios开发日记 10- CGPathAddArc和CGPathAddArcToPoint函数

http://www.cnblogs.com/mgen/p/3426303.html 注意:CGPathAddArc和CGContextAddArc,以及UIBezierPath类型的addArcWithCenter:radius:startAngle:endAngle:clockwise:方法原理都类似.而CGPathAddArcToPoint和CGContextAddArcToPoint函数则原理类似.只不过CGPath相关的函数多了一个CGAffineTransform参数,可以直接应用T

CGPathAddArc vs CGPathAddArcToPoint

CGContextAddArc : 红线是我们想要画的, sA 是startAngle, eA 为 endAngle, r 是半径, x 和 y 对应参数中的 x 和 y. 如果有前置点,方法将画一条从该点到狐的起点,除非你非常小心,不然这条线不会和弧线同一个方向. CGContextAddArcToPoint : P1是path的当前点,x1, x2, y1, y2 对应方法中 x1, x2, y1, y2,r 为半径.弧线将开始于当前点和(x1,y1)组成的直线并结束于(x1,y1)和(x2

李洪强iOS开发Swift篇—07_函数

李洪强iOS开发Swift篇—07_函数 一.函数的定义 (1)函数的定义格式 1 func 函数名(形参列表) -> 返回值类型 { 2 // 函数体... 3 4 } (2)形参列表的格式 形参名1: 形参类型1, 形参名2: 形参类型2, … (3)举例:计算2个整数的和 1 func sum(num1: Int, num2: Int) -> Int { 2 return num1 + num2 3 } (4)没有返回值的函数 如果函数没有返回值,有3种写法 1 func 函数名(形参列

李洪强iOS开发Swift篇—08_函数(2)

李洪强iOS开发Swift篇—08_函数(2) 一.函数类型 函数类型也是数据类型的一种,它由形参类型和返回值类型组成,格式是 (形参类型列表) -> 返回值类型 1 func sum(num1: Int, num2: Int) -> Int { 2 return num1 + num2 3 } sum函数的函数类型是(Int, Int) -> Int 1 func printLine() 2 { 3 println("-----------") 4 } printL

IOS Quartz 2D 学习(1)

IOS提供两种创建图形的途径: 1.OpenGL. 2.Quartz.Core Animation.UIKit图形支持. UIKit的图形系统 1.视图绘画周期: DrawRect方法,在任何时候,当视图的一部分需要重画时会调用. 触发调用的四种情况: 1>对遮挡您的视图的其它视图进行移动或删除操作. 2>将视图的hidden属性声明设置为NO,使其从隐藏状态变为可见. 3>将视图滚出屏幕,然后再重新回到屏幕上. 4>显式调用视图的setNeedsDisplay或者setNeeds

IOS Quartz 各种绘制图形用法---实现画图片、写文字、画线、椭圆、矩形、棱形等

转自:http://blog.csdn.net/zhibudefeng/article/details/8463268 [cpp] view plain copy // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { CGC

iOS:UIView的block函数实现转场动画---双视图

使用UIView动画函数实现转场动画——双视图 + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion; 参数说明: –duration:动画的持续时间 –options:转

李洪强iOS开发之OC[017]函数和方法的区别

// //  main.m //  15 - 函数和对象的方法的区别 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All rights reserved. // 函数和对象方法的区别 对象方法: - (void)run; #import <Foundation/Foundation.h> @interface Person : NSObject{ @public //定义实例变量 NSString *_nam

李洪强漫谈iOS开发[C语言-054]-函数

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #822d0f }