0

関数 addCurveToPoint を使用して CGPoint の配列で作成された UIBezierPath があります。コードの一部を以下に示します。

UIBezierPath *path = [[UIBezierPath alloc] init];
[path setLineWidth:10];
[path moveToPoint:pts[0]];
for(int i = 0; i<[array count]; i++) {
     [path addCurveToPoint:[array objectAtIndex:i] controlPoint1:pts[1] controlPoint2:pts[2]];
}

ビューでタッチが認識されると、タッチのポイントを取得し、それを UIBezierPath の GCPoint と比較して、UIBezierPath 内にあるかどうかを判断する必要があります。私が使用したのは関数 containsPoint ですが、機能しませんでした。これが私のコードです。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint p = [touch locationInView:self];
    CGPoint point = CGPointMake(p.x, p.y);
    NSLog(@"actual point x %f y %f", point.x, point.y);

    if ([path containsPoint:point]) {
        NSLog(@"it contains the point");
    }
}

最後に、タッチされたポイントのすべてのセットを取得し、タッチされたポイントが UIBezierPath (またはそれらのほとんど) 内にあるかどうかを確認し、マージンエラーを追加して、タッチがそれほど正確である必要がないようにする必要があります。 UIBezierPath のポイントはどのくらいですか?

4

1 に答える 1

2

太いストローク バージョンのパスを作成するために使用CGPathCreateCopyByStrokingPathします (たとえば、lineWidth22 に設定)。次に、その点がそのストローク パスまたは元のパスの内側にあるかどうかをテストします。

Ole Begemann: CGPath ヒット テスト

于 2013-11-13T19:45:57.577 に答える