将箭头附加到UIBezierPath

use*_*877 3 objective-c uibezierpath quartz-core

我需要你的帮助:

我正在尝试使用具有可变宽度的UIBezierPaths创建图形,并且包含具有两个控制点的贝塞尔曲线.现在我想在这些路径的末尾(右侧)添加箭头.有没有办法做到这一点,即通过附加一个包含三角形的较小lineWidth的子路径?这是我要添加箭头的一些路径的示例图片:

在此输入图像描述

谢谢你的帮助!

Rob*_*Rob 8

我们假设您绘制了一个弧形:

UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:point1];
[path addQuadCurveToPoint:point3 controlPoint:point2];

CAShapeLayer *shape = [CAShapeLayer layer];
shape.path = path.CGPath;
shape.lineWidth = 10;
shape.strokeColor = [UIColor blueColor].CGColor;
shape.fillColor = [UIColor clearColor].CGColor;
shape.frame = self.view.bounds;
[self.view.layer addSublayer:shape];
Run Code Online (Sandbox Code Playgroud)

您可以atan2用来计算从控制点到最终点的角度:

CGFloat angle = atan2f(point3.y - point2.y, point3.x - point2.x);
Run Code Online (Sandbox Code Playgroud)

注意,如果你使用四个贝塞尔曲线或立方体并不重要,这个想法是一样的.计算从最后一个控制点到终点的角度.

然后,您可以通过计算三角形的角来放置箭头,如下所示:

CGFloat distance = 15.0;
path = [UIBezierPath bezierPath];
[path moveToPoint:point3];
[path addLineToPoint:[self calculatePointFromPoint:point3 angle:angle + M_PI_2 distance:distance]]; // to the right
[path addLineToPoint:[self calculatePointFromPoint:point3 angle:angle          distance:distance]]; // straight ahead
[path addLineToPoint:[self calculatePointFromPoint:point3 angle:angle - M_PI_2 distance:distance]]; // to the left
[path closePath];

shape = [CAShapeLayer layer];
shape.path = path.CGPath;
shape.lineWidth = 2;
shape.strokeColor = [UIColor blueColor].CGColor;
shape.fillColor = [UIColor blueColor].CGColor;
shape.frame = self.view.bounds;
[self.view.layer addSublayer:shape];
Run Code Online (Sandbox Code Playgroud)

我们使用sinfcosf计算角落的地方如下:

- (CGPoint)calculatePointFromPoint:(CGPoint)point angle:(CGFloat)angle distance:(CGFloat)distance {
    return CGPointMake(point.x + cosf(angle) * distance, point.y + sinf(angle) * distance);
}
Run Code Online (Sandbox Code Playgroud)

这产生了一些看起来像:

在此输入图像描述

显然,只需调整distance参数即可控制三角形的形状.