2

画面上で指を使って矢印を描画しようとしています。画面をタッチすることで矢印の初期座標を設定し、画面をドラッグすると矢印が伸びて指をたどるというアイデアでした。矢印の高さと幅は同じになり、重要な矢印のサイズになります。矢印を始点からドラッグすると、矢印が長くなります。私はこのようなものでそれをドンしてみました:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIGraphicsBeginImageContext(CGSizeMake(1536, 2048));

    UITouch *touch = [touches anyObject];
    CGPoint p1 = [touch locationInView:self.view];

    CGSize size;
    size.width = 50;
    size.height = 400;

    CGContextRef context = UIGraphicsGetCurrentContext();

    [self drawArrowWithContext:context atPoint:p1 withSize:size lineWidth:4 arrowHeight:20 andColor:[UIColor whiteColor]];

    // converts your context into a UIImage
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // Adds that image into an imageView and sticks it on the screen.
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubview:imageView];
}

- (void) drawArrowWithContext:(CGContextRef)context atPoint:(CGPoint)startPoint withSize: (CGSize)size lineWidth:(float)width arrowHeight:(float)aheight andColor:(UIColor *)color
{
    float width_wing = (size.width - width) / 2;
    float main = size.height-aheight;

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextSetStrokeColorWithColor(context, [color CGColor]);

    CGPoint rectangle_points[] = {
        CGPointMake(startPoint.x + width_wing, startPoint.y + 0.0),
        CGPointMake(startPoint.x + width_wing, startPoint.y + main),
        CGPointMake(startPoint.x + 0.0, startPoint.y + main), // left point
        CGPointMake(startPoint.x + size.width / 2, startPoint.y + size.height),

        CGPointMake(startPoint.x + size.width, startPoint.y + main), // right point

        CGPointMake(startPoint.x + size.width-width_wing, startPoint.y + main),

        CGPointMake(startPoint.x + size.width-width_wing, startPoint.y + 0.0),
        CGPointMake(startPoint.x + width_wing, startPoint.y + 0.0),
    };

    CGContextAddLines(context, rectangle_points, 8);

    CGContextFillPath(context);
}

通常のIBOutletで移動したタッチからコードを実行すると、画面に矢印が表示されますが、それは考えられませんでした。このコードはまだ機能していませんが、毎回図形を削除して再描画しているので、機能してもクラッシュする可能性があると思います。これは正しいアプローチですか?私は何をすべきか?

4

2 に答える 2

1

基本的に、いくつかの異なるオプションがあります。

  • UIImageViewアプローチに固執し、常に画像ビューの再作成を停止します。タッチイベントを検出するクラスでそのUIImageViewへの参照を保持し、何かが変更された場合は画像を置き換えるだけです。他の何かのために画像が必要な場合は、画面外に描画するために余分な努力をする価値があるかもしれません。
  • 追加のビューで矢印の描画を動的に実装します。

ここで簡単に説明する2番目のもの:

イベントを検出するクラスには、メンバー変数/プロパティ、ArrowView * arrowView、および開始点を記憶するための何か、おそらくCGPointstartPointが必要です。ArrowViewには、矢印パラメーターCGPoint arrowStart、CGSizearrowSizeのプロパティが必要です。タッチイベントハンドラーで、

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint position = [touch locationInView:self.view];

    [self.startPoint startFrom:position];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint next = [touch locationInView:self.view];

    CGSize size;
    size.width = next.x - self.startPoint.x;
    size.height = next.y - self.startPoint.y;

    self.arrowView.arrowPoint = self.startPoint;
    self.arrowView.arrowSize = size;

    [self.arrowView setNeedsDisplay];
}

ArrowViewの場合:

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    // Now do the drawing stuff here using that context!
    // self.arrowSize / self.arrowPoint do contain your drawing parameters.
    ...
}

それがあなたにアイデアを与えることを願っています。

詳細については、ここから始めてください。

于 2013-01-22T20:41:30.383 に答える
0

YoはUIPanGestureRecognizer、指をたどってその上に描くために使用することができます。

于 2013-01-22T21:22:48.207 に答える