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

时间:2012-01-02 16:05:41

标签: iphone ios cocoa-touch uikit core-graphics

我正在编写一个iPhone应用程序,就像appstore上的pick stick应用程序一样。我已经完成了绘制多行并使用CoreGraphics显示它。但现在我不知道当用户点击它时如何删除该行。我在Google上搜索了很多,但没有发现任何相关内容。


我在其他地方看过你的这篇帖子,这真的帮助了我。但问题是 如果我有一根棍子,然后另一根棍子在它上面。 当我点击下面的棒时,它不应该被删除,如果我点击上面的话,它应该被删除,如果它上面没有棒。如何实现这个东西..我需要存储路径,即我的行是UIBeizerpath在列表,数组,字典中的任何东西,请帮助我这个东西。我找不到任何东西。

2 个答案:

答案 0 :(得分:0)

我看到引发了两个问题:(1)如何检测视图中绘制的线上的触摸,以及(2)如何在没有触摸线的情况下重绘视图。组合方法是将线对象定义为转换为字符串的矩形:NSStringFromCGRect(CGRectMake(x, y, width, height)。将一个或多个行对象添加到NSSet *setOfLines,并在显示行的drawRect:类的UIView方法中添加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. 根据用户交互更改数据对象,然后强制重绘部分或全部视图

答案 1 :(得分:0)

如果您在UIView中使用Core Graphics,则不必删除任何内容。相反,您可以完全重绘视图,但可能少用一根。