Core Graphics 触摸时画线和删除

Posted

技术标签:

【中文标题】Core Graphics 触摸时画线和删除【英文标题】:Core Graphics Line drawing and deleting on touch 【发布时间】:2012-01-02 16:05:40 【问题描述】:

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


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

【问题讨论】:

【参考方案1】:

我看到了 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;
        
    

这里的设计模式是:

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

【讨论】:

或者,你可以store them in NSValue objects代替字符串,这样可以节省生成和解析字符串的费用。 NSValue 是 NSString 的计算量最小的替代方案。 NSString 的优点是在 UIKit 中对 CGGeometry 的支持、对 NSPropertyListSerialization 的支持(因此您可以制作人类可读的几何图形的 XML 表示)以及在 Core Data 中的原生属性支持。 关于第一点,您是指CG几何类型的使用吗?如果是这样,请参阅我链接到的文档。 这是一个很有用的类别,UIKit 支持带有 CG 几何的 NSValue,感谢您的链接。【参考方案2】:

如果您在 UIView 中使用 Core Graphics,则无需删除任何内容。相反,您将能够完全重绘视图,但可能会少一根棍子。

【讨论】:

以上是关于Core Graphics 触摸时画线和删除的主要内容,如果未能解决你的问题,请参考以下文章

使用图像无法正确缩放的绘制视图缩放:Android

CGContextRef画线和点,如何清屏?

Java画线和按键改变颜色

Halcon - 找到边缘位置,画线和线交点

如何使用 Core Graphics 绘制点?

使用 Core Graphics 制作类似画笔的纹理