Ios 使用TouchsMoved绘制形状

Ios 使用TouchsMoved绘制形状,ios,cocoa-touch,Ios,Cocoa Touch,我正试图用手指在屏幕上画一个箭头。当时的想法是,通过触摸屏幕,我设置了箭头的初始坐标,当我在屏幕上拖动箭头时,箭头将延伸并跟随我的手指。箭头的高度和宽度是相同的,重要的是箭头的大小。当我将箭头拖离起点时,箭头会更长。我试过这样做: - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UIGraphicsBeginImageContext(CGSizeMake(1536, 2048)); UITou

我正试图用手指在屏幕上画一个箭头。当时的想法是,通过触摸屏幕,我设置了箭头的初始坐标,当我在屏幕上拖动箭头时,箭头将延伸并跟随我的手指。箭头的高度和宽度是相同的,重要的是箭头的大小。当我将箭头拖离起点时,箭头会更长。我试过这样做:

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


如果我运行在普通IBOutlet中移动的触摸的代码,屏幕上会出现箭头,但这不是我的想法。我还没有设法让这个代码工作,但我认为即使它工作,它也会导致崩溃,因为我每次都会删除并重新绘制形状。这是正确的方法吗?我该怎么办

基本上,有一些不同的选择

  • 坚持UIImageView方法,并停止始终重新创建图像视图。在检测触摸事件的类中保留对UIImageView的引用,如果有更改,只需替换图像。如果您需要图像来做其他事情,那么在屏幕外画图可能值得付出额外的努力
  • 在额外视图中动态实现箭头图形
第二个我将在这里简要介绍:

检测事件的类需要一个成员变量/属性ArrowView*ArrowView和一些可以记住起点的东西,CGPoint startPoint。 箭头视图需要箭头参数CGPoint arrowStart、CGSize ARROWSSIZE的属性。 在触摸事件处理程序中,执行以下操作:

- (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];
}
在箭头视图中:

- (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.
    ...
}
我希望这能给你一个想法


为了进一步阅读,

您可以尝试使用
UIPangestureRecognitizer
跟随您的手指并在上面绘制。

我不认为添加大量UIImageViews是一种好方法,特别是因为您已经在使用CoreGraphics。我知道,但我如何才能做到这一点?您并不总是开始一个新的图像上下文,但是你用默认的,然后画箭头,我怎么做?我需要创建一个context@Alexandro你没有。除非您做错了什么,
UIGraphicsGetCurrentContext()
仍然会返回有效的上下文。
- (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.
    ...
}