2015-05-10 3 views
2

Мне нужна ваша помощь:Append наконечник стрелы UIBezierPath

Я пытаюсь создать график, используя UIBezierPaths с переменной шириной и состоящий из кривой Безье с двумя контрольными точками. Теперь я хочу добавить стрелки в конец (справа) этих тезисов. Есть ли способ сделать это, добавив подпуть с меньшей шириной линии, которая содержит треугольник? вот пример картина некоторых путей, к которым я хотел бы добавить стрелки:

enter image description here

Спасибо за вашу помощь!

ответ

7

Давайте предположим, что вы нарисовали один из дуг, как так:

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]; 

Вы можете использовать atan2 вычислить угол от контрольной точки до конечной точки:

CGFloat angle = atan2f(point3.y - point2.y, point3.x - point2.x); 

Примечание, это Безразлично» Это действительно важно, если вы используете квази безье или кубик, идея такая же. Вычислите угол от последней контрольной точки до конечной точки.

Вы можете затем положить голову стрелка, вычисляя углы треугольника так:

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]; 

Где мы используем sinf и cosf для расчета углов, как так:

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

, который дает что-то похожее:

enter image description here

Ясно, просто отрегулируйте параметры distance, чтобы управлять формой треугольника.

+0

Спасибо, Роб! Это то, что я искал (на самом деле забыл упомянуть о части контрольной точки, что я бы сделал точно так же, спасибо за указание на это.) Однако я до сих пор не понимаю одну часть кода: [self.arrowShape removeFromSuperlayer]; Что это будет делать? – user1612877

+0

О, проигнорируйте это. Это был немного несвязанный код, который проскользнул туда. Теперь он исчез. – Rob