2015-07-11 2 views
0

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

Когда я рисую путь, я сохранить UIBezierPath копию, как это:

CGContextBeginPath(context); 
for (NSUInteger i = 0; i < _points.count - 1; i++) 
{ 
    // ... 
    CGContextAddCurveToPoint(context, cp1x, cp1y, cp2x, cp2y, endX, endY); 
} 
_path = [UIBezierPath bezierPathWithCGPath:CGContextCopyPath(context)]; 
CGContextStrokePath(context); 

создать новую точку с длинной пресс жест:

- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer 
{ 
    // ... 
    CGPoint point = [recognizer locationInView:self]; 
    if ([_path containsPoint:point]) 
    { 
     // process point 
    } 
    // ... 
} 

Но для этого требуется пользователю нажать очень близко к пути , Я хочу иметь более широкую область вокруг пути, где я считаю, что любой кран будет действительным (например, ширина линии).

Как настроить UIBezierPath, чтобы расширить область? Я хочу, чтобы он контролировал, насколько широка эта область.

ответ

0

Вот возможное решение:

CGPathRef pathCopy = CGContextCopyPath(context); 
// 16 is the width of path where we want to have hit test 
CGPathRef tapPath = CGPathCreateCopyByStrokingPath(pathCopy, NULL, 16, kCGLineCapButt, kCGLineJoinMiter, 0.6); 
// this path will be used for hit test 
_linePath = [UIBezierPath bezierPathWithCGPath:tapPath]; 
[_linePath closePath]; 

Теперь где-то нам это нужно:

CGPoint point = [recognizer locationInView:self]; 
if ([_linePath containsPoint:point]) 
{ 
    // work with point 
}