核心图形线绘制和删除触摸



我正在写一个iPhone应用程序,有点像appstore上的捡起棍子应用程序。我已经完成了绘制多条线并使用CoreGraphics显示它。但现在我被如何在用户点击该行时删除该行所困扰。我在谷歌上搜索了很多,但没有找到任何相关的东西。


我在其他地方看到了你的这篇文章,这真的帮助了我。但问题是如果我有一根棍子,然后另一根棍子在它上面。当我点击下面的操纵杆时,它不会被删除,如果我点击上面的,如果上面没有操纵杆,它应该会被删除。如何实现这一目标…我也需要存储路径,即我的行这是UIBeizerpath在一个列表,数组,字典无论什么,请帮助我这个东西也。

我看到提出了2个问题:(1)如何检测在视图中绘制的线上的触摸,以及(2)如何在没有触摸线的情况下重新绘制视图。一种组合的方法是将直线对象定义为转换为字符串的矩形:NSStringFromCGRect(CGRectMake(x, y, width, height)。在NSSet *setOfLines中添加一个或多个线条对象,并在显示线条的UIView类的drawRect:方法中添加Quartz 2D/Core Graphics绘图代码。

- (void)drawRect:(CGRect)rect
{
    gc = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(gc, lineThickness]);
    CGContextSetStrokeColorWithColor(gc, ([UIColor redColor]).CGColor);
    for (NSString *lineString in setOfLines) {
        CGRect line = CGRectFromString(lineString);
        CGContextMoveToPoint(gc, line.origin.x, line.origin.y);
        CGContextAddLineToPoint(gc, (line.origin.x + line.size.width), (line.origin.y + line.size.height));
    }
    CGContextStrokePath(gc);
}

在同一个UIView类中,添加一个点击手势识别器(注意与双击共存):

UITapGestureRecognizer *singleTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lineSingleTapped:)];
singleTapper.numberOfTapsRequired = 1;
[singleTapper requireGestureRecognizerToFail:doubleTapper];
[cell addGestureRecognizer:singleTapper];    

- (IBAction)lineSingleTapped:(UITapGestureRecognizer *)sender
{
    CGPoint tapPoint = [sender locationInView:self];
    // Get the line that was tapped
    for (NSString *lineString in setOfLines) {
        CGRect line = CGRectFromString(lineString);
        // Make a rectangle that defines the tappable area of a line: disclaimer, might be very thin or short!
        // A minimum size of 44.0 x 44.0 is advisable
        CGRect lineTapArea = CGRectMake(line.origin.x, line.origin.y, (line.origin.x + line.size.width), line.origin.y + line.size.height);
        if (CGRectContainsPoint(lineTapArea, tapPoint)) {
            [setOfLines removeObject:lineObject];
            [self setNeedsDisplayInRect:lineTapArea];
            break;
        }
    }
}

这里的设计模式是:

  1. 为用户交互和绘图实现绘图视图类
  2. 定义表示要绘制的可视元素的数据对象
  3. 根据用户交互改变数据对象,然后强制部分或全部视图重绘

如果你在UIView中使用Core Graphics,你不需要删除任何东西。相反,您将能够完全重新绘制视图,但可能少了一根棍子。

最新更新