首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TouchesMoved绘制形状

使用TouchesMoved绘制形状
EN

Stack Overflow用户
提问于 2013-01-23 04:07:35
回答 2查看 988关注 0票数 2

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

代码语言:javascript
复制
- (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];
}

代码语言:javascript
复制
- (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中移动的触摸代码,屏幕上确实会出现箭头,但这不是我的想法。我还没有设法让这段代码工作,但我认为即使它工作了,它也会导致崩溃,因为我每次都会删除并重绘形状。这是正确的方法吗?我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-23 04:41:30

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

  • 坚持UIImageView方法,停止一直重新创建图像视图。在检测触摸事件类中保留对UIImageView的引用,并在发生变化时替换图像。如果您需要在额外视图中动态绘制箭头的图像,那么在屏幕外绘制可能值得付出额外的努力。

第二个我将在这里简要描述:

检测事件的类需要一个成员变量/属性,ArrowView *arrowView和一些东西来记住起始点,也许是CGPoint startPoint。ArrowView需要箭头参数、CGPoint arrowStart、CGSize arrowSize的属性。在触摸事件处理程序中,执行

代码语言:javascript
复制
- (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中:

代码语言:javascript
复制
- (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.
    ...
}

我希望这能给你一个想法。

如需进一步阅读,请参阅start here.

票数 1
EN

Stack Overflow用户

发布于 2013-01-23 05:22:48

你可以尝试使用UIPanGestureRecognizer来跟踪你的手指并在上面绘制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14467111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档