1

我的 UIVIew 中有两个方形图像。一旦我将手指从一个图像拖动到另一个图像,我想在它们之间画一条直线。

我已经处理touchesMoved了检查我的touchLocation 何时到达任一图像的框架的方法。所以我已经处理了何时开始绘制以及在哪两点之间的逻辑部分。

我只是不知道如何使用(void)drawRect:(CGRect)rect. 一方面,我在 drawRect 中添加了一个 NSlog,并编写了代码在两行之间画一条线,即使这没有发生。

我也检查了这个问题,但我想继续在多个点之间拖动和画线。

    - (void)drawRect:(CGRect)rect
{
    NSLog(@"Draw Rect Entered");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor]CGColor]);
    CGContextSetLineWidth(context, 1.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, 20, 20);
    CGContextStrokePath(context);
}
4

2 回答 2

0

我遇到的两个问题可能会导致此问题:
1)确保您正在调用setNeedsDisplay主线程
2)如果您正在使用多个视图,请确保您正在调用setNeedsDisplay正确的视图。
使用一个视图很容易而忘记调用setNeedsDisplay父视图。

于 2013-03-12T12:46:15.743 回答
0

为了使视图更新,您需要调用-setNeedsDisplay-setNeedsDisplayInRect:在需要重绘的视图上。一旦确定需要画线,就应该在触摸处理程序中执行此操作。这将触发-drawRect:视图上的方法-您不-drawRect直接调用。有关更多信息,请阅读UIView文档。我不知道您是否希望您的线在创建后永久存在-如果有可能将其删除,我将添加一个if语句-drawRect:来由布尔值控制,以确定是否绘制线。然后,您可以在必要时轻松将其关闭。

根据您在下面的评论,我将创建一个 ivar 数组,在其中存储当前跟踪线的点,然后在它们中循环-drawRect:,使用核心图形函数一次绘制一条线。这样,每次重绘都会绘制新段和所有以前的段。由于CGPoint不是 obj-c 对象,您要么必须创建一个包装类,要么使用 obj-C++ 和std::vector. 您还可以使用固定大小的 C-Array,(您提到您正好有 10 个点)- 在这种情况下,您必须将未使用的坐标预设为定义为无效的任意值(例如 -500、-500)并添加如果遇到这些值,则不绘制线段的逻辑。

次要点-我不会对线坐标进行硬编码-相反,您可以从图像的frame属性中得出它们。这样,您的代码将更具可读性,并且在您更改图像或调整它们大小时不会中断。

于 2013-03-08T14:34:16.037 回答