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 触摸时画线和删除的主要内容,如果未能解决你的问题,请参考以下文章