-1

我一直在研究折线叠加,当我被卡住时得到了很好的帮助,我希望再次获得更多帮助。

在我的项目中,我在地图上绘制折线,从触摸开始到触摸移动。我的手指被拖动的坐标被添加到我的数组中并显示出来。

当我想清除我的行时,我只需清空数组,这很好

但是,如果我想删除/撤消最后绘制的线。我的印象是我可以从数组中减去最后一个值,但在更深入地思考时,我意识到我可能有问题。数组中的每个元素都是我的手指最后一次触摸的坐标。我还没有尝试过,但我想如果我只减去数组的最后一个值,我会花很长时间“擦除”我画的一条线。我正在寻找一种方法,当我按“撤消”时,它会擦除​​我画的整条线。即使这条线从北美延伸到英国。

4

1 回答 1

0

OP 希望能够撤消绘制的最后一条线。他想象的问题是,从数组中删除单个元素在视觉上只会删除用户绘制的线的一部分。他希望做的是删除数组中构成该行的所有元素。

我在绘图方面做得不多,但我对您的问题的解决方案应该有效。

执行以下操作,创建一个枚举数据类型,该类型将为绘制到屏幕/添加到数组的每个坐标创建三种可能的状态。

这种数据类型看起来像这样:

typedef NS_ENUM(NSInteger, PKLinePointState) {
    PKLinePointStart,
    PKLinePointMiddle,
    PKLinePointEnd
};

这里的想法是您将使用此数据类型来确定数组中的哪些元素是起点以及数组中的哪些元素是终点。通过这种方式,您可以确定数组中的行,因此能够确定要删除多少元素,直到您击中状态为 的坐标PKLinePointStart

您不想只在数组中存储坐标,而是希望存储一个数据模型,该模型将保存更多信息,以便您可以做您希望完成的性感事情。

第一个数据模型将用于存储数组中的开始和结束坐标和元素。这将使您的坐标更容易工作。这就是它的样子:

线点模型.h

typedef NS_ENUM(NSInteger, PKLinePointState) {
        PKLinePointStart,
        PKLinePointMiddle,
        PKLinePointEnd
    };

@interface LinePointModel : NSObject

@property (assign) CGPoint linePointCoordinate; 
@property (assign) PKLinePointState linePointState; 
@end

//you may want to create a custom initialiser so that the coordinate and state are initialised straight away.
//It would look something like this -(instanceType)initWithLinePointCoordinate:(CGPoint)coordinate andLinePointState:(PKLinePointState)linePointstate;

线点模型.m

//I'll let you complete the initialiser method in the implementation file.

现在您已经创建了将坐标正确存储在 中的数据模型,下面coordinates array是我将它们添加到数组中的方法。

逻辑阶段 1:

当用户点击屏幕 -touchesBegan方法被调用时,您可能希望创建 的实例LinePointModel并将其坐标值设置为用户在屏幕上点击的第一个坐标,并将 设置为state标记PKLinePointStart开始的位置线。将此元素添加到数组中。

然后,当用户在屏幕上拖动时,您将收到来自touchesMoved. 在这里,您将再次设置坐标创建相同数据模型的实例,但这次状态将存储为PKLinePointMiddle,我们并不真正关心这些点,因为我们不会检查此状态,但给它一个仍然很好值,以便我们知道数组中具有此状态的任何元素仅服务于形成一个点,这些点最终形成一条完整的线。在这里,这些实例将根据需要不断地添加到数组中,直到用户最终停止拖动 - 绘制当前行 - 在屏幕上。

一旦touchesEnded方法被调用 - 表示行的结束 - 用户抬起手指,这是您创建数据模型的最后一个实例的地方,相应地设置坐标,最后状态将是PKLinePointEnd状态。同样,您也可以在数组中添加这个实例。

现在您有了一个有意义的自定义数组,它跟踪所有坐标,但让您知道哪个元素具有起始状态、中间状态和结束状态。

每个起始状态都与结束状态相结合,其中包含组成线条所需的许多中间元素。

如果你想在这里停下来,你只需运行 for 循环,并确定你的数组中添加的最新元素start和元素。end:)

逻辑阶段 2 - 改进算法:

现在您不希望循环遍历数组中的数千个元素,只是为了确定您必须返回到数组中的多远才能删除一行,那将是低效的。这是您的第二个数据模型将派上用场的地方。第二个数据模型将跟踪您的线条并存储阵列中的哪些元素构成其线条,start甚至end index更好地存储坐标数组,这就是我们将要做的。

线阵列模型.h

@interface LineArrayModel : NSObject

@property (nonatomic, retain) NSMutableArray *arrayOfLinePoints;  //What matters.
//@property (assign) int lineNumber; 
//@property (assign) CGFloat lineThickness;
//@property (strong, nonatomic) UIColor *lineColor;
@end

使用此数据模型,您将在用户在屏幕上画线时创建一个临时数组,一旦他们完成画线,您将获取该数组并将其存储在 ; 的实例中LineArrayModel。您将使用此实例将其存储在名为 myLinesArray 的新数组中。这是您将用来在屏幕上绘制线条的数组。

然后要简单地撤消一条线,您只需删除存储所有线的数组中的最后一个实例LineArrayModel,然后在必要时简单地重新绘制线。

让我知道你是怎么办的。

于 2014-12-17T04:05:53.403 回答