Ios 撤消上次绘制的多段线

Ios 撤消上次绘制的多段线,ios,objective-c,mkmapview,mkoverlay,mkpolyline,Ios,Objective C,Mkmapview,Mkoverlay,Mkpolyline,我一直在一个多段线覆盖工作,并得到了很好的帮助,当我被卡住,我希望有更多的帮助再次 在我的项目中,我在地图上绘制从接触开始到接触移动的多段线。将手指拖动位置的坐标添加到阵列中并显示 当我想清除我的行时,我只是清空数组,这很好 但是,如果要删除/撤消绘制的最后一条线。我的印象是,我可以从数组中减去最后一个值,但在深入思考时,我意识到我可能有问题。数组中的每个元素都是我手指最后一次接触的坐标。 我还没有尝试过这个,但我在想象,如果我只减去数组的最后一个值,我会花很长时间“擦除”我画的一条线。 我在寻

我一直在一个多段线覆盖工作,并得到了很好的帮助,当我被卡住,我希望有更多的帮助再次

在我的项目中,我在地图上绘制从接触开始到接触移动的多段线。将手指拖动位置的坐标添加到阵列中并显示

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

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

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

我在画画方面做得不多,但我解决你问题的办法应该行得通

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

此数据类型将如下所示:

typedef NS_ENUM(NSInteger, PKLinePointState) {
    PKLinePointStart,
    PKLinePointMiddle,
    PKLinePointEnd
};
这里的想法是,您将使用此数据类型来确定数组中的哪些元素是起点,哪些元素是终点。通过这种方式,您可以确定数组中的行,从而能够确定要删除的元素数,直到到达状态为
PKLinePointStart
的坐标为止

您不希望只在数组中存储坐标,而是希望存储一个包含更多信息的数据模型,以便您可以完成希望完成的任务

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

LinePointModel.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;
@interface LineArrayModel : NSObject

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

//I'll let you complete the initialiser method in the implementation file.
现在您已经创建了将坐标正确存储在
坐标数组中的数据模型,下面是我将如何将它们添加到数组中

逻辑阶段1:

当用户点击屏幕时,
touchesbeated
方法被调用,您需要创建
LinePointModel
的实例,并将其坐标值设置为用户在屏幕上点击的第一个坐标,并将
状态设置为
PKLinePointStart
,以标记行的开始。将此元素添加到数组中

然后,当用户拖动屏幕时,您将从
触摸移动
接收多个坐标。在这里,您将再次创建同一数据模型的实例,设置坐标,但这次状态将存储为
PKLinePointMiddle
,我们并不真正关心这些点,因为我们不会检查此状态,但是给它一个值还是很好的,这样我们就知道数组中任何具有这种状态的元素只会形成一个点,这些点最终形成一条整条线。在这里,这些实例将根据需要不断添加到数组中,直到用户最终停止在屏幕上拖动(绘制当前行)

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

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

每个起始状态都与结束状态相耦合,中间元素的数量与组成该行所需的数量相同

如果要在此停止,只需运行for循环,并确定在数组中添加的最新
start
end
元素。:)

逻辑阶段2-改进算法:

现在你不想在一个数组中循环数千个元素,只是为了确定你必须回到数组中多远才能删除一行,这将是低效的。这是第二个数据模型将非常有用的地方。第二个数据模型将通过存储
开始
结束
索引
来跟踪您的行,并存储数组中的哪些元素组成其行,或者更好地存储坐标数组,这就是我们将要做的

LineArrayModel.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;
@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
,然后根据需要重新绘制行即可


让我知道你进展如何

什么决定了线是什么?它是数组中的一个简单元素,还是数组中的多个元素?如果是多个元素,y如何