OP は、描画された最後の行を元に戻せるようにしたいと考えています。彼が想像する問題は、配列から単一の要素を削除すると、ユーザーが描いた線の一部を視覚的に削除するだけになることです。彼がやりたいことは、行を構成する配列内のすべての要素を削除することです。
私は絵を描いたことはあまりありませんが、あなたの問題に対する私の解決策はうまくいくはずです。
次の手順を実行して、画面に描画される/配列に追加される各座標に対して 3 つの可能な状態を作成する列挙型データ型を作成します。
このデータ型は次のようになります。
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;
LinePointModel.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 - アルゴリズムの改善:
行を削除するためだけに配列内のどこまで戻る必要があるかを判断するためだけに、配列内の何千もの要素をループすることは望ましくありません。これは非効率的です。ここで、2 番目のデータ モデルが役立ちます。この 2 番目のデータ モデルは、線を追跡し、配列内のどの要素がその線を構成しているかを格納start
しend
index
ます。
LineArrayModel.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
すべての行を格納する配列の最後のインスタンスを削除し、必要に応じて行を再描画します。
乗り方を教えてください。