1

多かれ少なかれ弧の形をした BezierPath を持っています。ユーザーが弧の内側をタップできるようにしたいのですが (より明確にするためのドアになる可能性があります)、弧の上ではできません。 . しかし、私はこれを行うことはできません.アーク内のスペースもBezierPathの一部であるようですが、唯一のことはそれが透明であることです.

BezierPath を作成するコードは次のとおりです。

- (UIImageView*)drawBezierPath {
    //// Bezier Drawing
    UIBezierPath* bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint: CGPointMake(55.5, 643.5)];
    [bezierPath addLineToPoint: CGPointMake(55.5, 417)];
    [bezierPath addLineToPoint: CGPointMake(63, 399)];
    [bezierPath addLineToPoint: CGPointMake(69.5, 381.5)];
    [bezierPath addLineToPoint: CGPointMake(79, 363.5)];
    [bezierPath addLineToPoint: CGPointMake(91, 346)];
    [bezierPath addLineToPoint: CGPointMake(102, 331)];
    [bezierPath addLineToPoint: CGPointMake(114.5, 314.5)];
    [bezierPath addLineToPoint: CGPointMake(127.5, 301.5)];
    [bezierPath addLineToPoint: CGPointMake(142.5, 286)];
    [bezierPath addLineToPoint: CGPointMake(156.5, 273.5)];
    [bezierPath addLineToPoint: CGPointMake(171, 260)];
    [bezierPath addLineToPoint: CGPointMake(189.5, 247.5)];
    [bezierPath addLineToPoint: CGPointMake(207.5, 234.5)];
    [bezierPath addLineToPoint: CGPointMake(229.5, 222.5)];
    [bezierPath addLineToPoint: CGPointMake(250, 211)];
    [bezierPath addLineToPoint: CGPointMake(272.5, 202)];
    [bezierPath addLineToPoint: CGPointMake(295.5, 194)];
    [bezierPath addLineToPoint: CGPointMake(321, 186.5)];
    [bezierPath addLineToPoint: CGPointMake(349, 180.5)];
    [bezierPath addLineToPoint: CGPointMake(375, 179)];
    [bezierPath addLineToPoint: CGPointMake(398, 177.5)];
    [bezierPath addLineToPoint: CGPointMake(424.5, 177.5)];
    [bezierPath addLineToPoint: CGPointMake(448.5, 180.5)];
    [bezierPath addLineToPoint: CGPointMake(473, 184.5)];
    [bezierPath addLineToPoint: CGPointMake(498.5, 192)];
    [bezierPath addLineToPoint: CGPointMake(521.5, 200)];
    [bezierPath addLineToPoint: CGPointMake(544.5, 209.5)];
    [bezierPath addLineToPoint: CGPointMake(565.5, 220)];
    [bezierPath addLineToPoint: CGPointMake(584, 231)];
    [bezierPath addLineToPoint: CGPointMake(603, 244)];
    [bezierPath addLineToPoint: CGPointMake(623.5, 259)];
    [bezierPath addLineToPoint: CGPointMake(640.5, 274)];
    [bezierPath addLineToPoint: CGPointMake(657.5, 290.5)];
    [bezierPath addLineToPoint: CGPointMake(673, 308)];
    [bezierPath addLineToPoint: CGPointMake(688.5, 327)];
    [bezierPath addLineToPoint: CGPointMake(702.5, 346.5)];
    [bezierPath addLineToPoint: CGPointMake(715, 368)];
    [bezierPath addLineToPoint: CGPointMake(727, 392.5)];
    [bezierPath addLineToPoint: CGPointMake(736.5, 414.5)];
    [bezierPath addLineToPoint: CGPointMake(736.5, 644)];
    [bezierPath addLineToPoint: CGPointMake(789.5, 644.5)];
    [bezierPath addLineToPoint: CGPointMake(789.5, 1)];
    [bezierPath addLineToPoint: CGPointMake(2.5, 1)];
    [bezierPath addLineToPoint: CGPointMake(2, 645)];
    [bezierPath addLineToPoint: CGPointMake(55.5, 643.5)];
    [bezierPath closePath];
    [[UIColor blackColor] setFill];
    [bezierPath fill];
    [[UIColor blackColor] setStroke];
    bezierPath.lineWidth = 1;
    [bezierPath stroke];

    UIGraphicsBeginImageContext(CGSizeMake(800, 800));

    //this gets the graphic context
    CGContextRef context = UIGraphicsGetCurrentContext();

    //you can stroke and/or fill
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    [bezierPath fill];
    [bezierPath stroke];

    //now get the image from the context
    UIImage *bezierImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    UIImageView *bezierImageView = [[UIImageView alloc]initWithImage:bezierImage];
    bezierImageView.alpha = 0;
    bezierImageView.frame = CGRectMake(115, 92, bezierImageView.frame.size.width, bezierImageView.frame.size.height);
    return bezierImageView;
}

このメソッドでは、bezierPath を作成し、別のビューに追加するために UIImageView に保存します。

bezierPath は奇妙なフォームを描画し、そのフォームのスペースだけを占有するのに役立つと思っていましたが、今ではどう考えればよいかわかりません。

それについてのアイデアはありますか?ありがとう!

4

3 に答える 3

3

QuartzCore.Framworkステップ 1 :プロジェクトに追加する

ステップ 2: #import <QuartzCore/QuartzCore.h>.h ファイルで

UIBezierPath *path;ステップ 3: .h ファイルで変数を定義する

viewDidLoadステップ 4 :メソッドで三角形を描く

path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(100, 100)];
[path addLineToPoint:CGPointMake(50, 200)];
[path addLineToPoint:CGPointMake(150, 200)];
[path closePath];
[path setLineWidth:2.0f];

// Draw a shape Layer with Triangle Path
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.fillColor   = [UIColor redColor].CGColor;
shapeLayer.strokeColor = [UIColor yellowColor].CGColor;
shapeLayer.lineWidth   = 2;
shapeLayer.path = path.CGPath;

// Add it to your view
[self.view.layer addSublayer:shapeLayer];

ステップ 5 : View & Shape でのタッチを検出するために、次の Touch メソッドを実装します。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint currentPoint = [touch locationInView:self.view];
    if([path containsPoint:currentPoint])
    {
        NSLog(@"its Inside Triangle Path");
    }
    else
    {
        NSLog(@"OutSide Shape");
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self.view];
    if([path containsPoint:currentPoint])
    {
        NSLog(@"its Inside Triangle Path");
    }
    else
    {
        NSLog(@"OutSide Shape");
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint currentPoint = [touch locationInView:self.view];
    if([path containsPoint:currentPoint])
    {
        NSLog(@"its Inside Triangle Path");
    }
    else
    {
        NSLog(@"OutSide Shape");
    }
}

このような任意の形状を作成して比較できます。

于 2013-04-25T19:15:03.183 に答える