extension UIBezierPath {
class func arrow(from start: CGPoint,
to end: CGPoint,
tailWidth: CGFloat,
headWidth: CGFloat,
headLength: CGFloat) -> Self
{
let length = hypot(end.x - start.x, end.y - start.y)
let tailLength = length - headLength
// расчет координат
let points: [CGPoint] = [CGPoint(x: 0, y: tailWidth / 2),
CGPoint(x: tailLength, y: tailWidth / 2),
CGPoint(x: tailLength, y: headWidth / 2),
CGPoint(x: length, y: 0),
CGPoint(x: tailLength, y: -headWidth / 2),
CGPoint(x: tailLength, y: -tailWidth / 2),
CGPoint(x: 0, y: -tailWidth / 2)
]
let cosine = (end.x - start.x) / length
let sine = (end.y - start.y) / length
// поворачиваем стрелку в зависимости от того как расположены начальная
// и конечная координаты
let transform = CGAffineTransform(a: cosine,
b: sine,
c: -sine,
d: cosine,
tx: start.x,
ty: start.y)
let path = CGMutablePath()
path.addLines(between: points, transform: transform)
path.closeSubpath()
return self.init(cgPath: path)
}
}
// функция для рисования стрелки
// size - размер картинки
// color - цвет стрелки
// startPoint - начальная координата стрелки
// endPoint - конечная координата стрелки
func drawArrow(size: CGSize, color: UIColor, startPoint: CGPoint, endPoint: CGPoint) -> UIImage {
let renderer = UIGraphicsImageRenderer(size: size)
let image = renderer.image { ctx in
ctx.cgContext.setFillColor(color.cgColor)
ctx.cgContext.setLineWidth(2)
let bezierPath = UIBezierPath.arrow(from: startPoint,
to: endPoint,
tailWidth: 2,
headWidth: 15,
headLength: 15)
ctx.cgContext.addPath(bezierPath.cgPath)
ctx.cgContext.fillPath()
}
return image
}