-1

私はポリライン オーバーレイに取り組んでおり、立ち往生したときに非常によく助けられました。もう一度助けてほしいと思っています。

私のプロジェクトでは、タッチが移動し始めてからマップ上にポリラインを描画しています。指がドラッグされた場所の座標が配列に追加されて表示されます。

行をクリアしたいときは、配列を空にするだけです。これで問題ありません

ただし、最後に描いた線を削除/元に戻したい場合。配列から最後の値を差し引くだけでよいという印象を受けましたが、より深く考えているうちに、問題がある可能性があることに気付きました。配列の各要素は、指が最後に触れた座標です。私はまだこれを試していませんが、配列の最後の値を差し引くだけだと想像しています。描いた線を「消去」するのに長い時間を費やすことになります。「元に戻す」を押すと、描いた線全体が消去される方法を探していました。その線が北アメリカからイギリスまで伸びていたとしても。

4

1 に答える 1

0

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その座標値をユーザーが画面上でタップした最初の座標に設定し、 を設定しstatePKLinePointStart、ライン。この要素を配列に追加します。

次に、ユーザーが画面上でドラッグすると、 から複数の座標を受け取りますtouchesMoved。ここで、座標を設定して同じデータ モデルのインスタンスを再度作成しますが、今回は状態PKLinePointMiddleをこの状態を持つ配列内の要素は、最終的に線全体を形成する点、つまり点を形成するサーバーのみであることを知ることができます。ここで、これらのインスタンスは、ユーザーが画面上でのドラッグ (現在の行の描画) を最終的に停止するまで、必要な回数だけ配列に追加され続けます。

touchesEndedメソッドが呼び出されるとすぐに(行の終わりを示します)、ユーザーが指を離します。ここで、データ モデルの最後のインスタンスを作成し、それに応じて座標を設定すると、最終的に状態が状態になりPKLinePointEndます。繰り返しますが、このインスタンスも配列内に追加します。

これで、すべての座標を追跡する意味のあるカスタム配列ができましたが、開始状態、中間状態、および終了状態を持つ要素を知ることができます。

すべての開始状態は、ラインを構成するために必要な数の中間要素を持つ終了状態と結合されます。

ここで停止する場合は、単純に for ループを実行し、配列内に追加された最新startの要素と要素を特定します。end:)

ロジック フェーズ 2 - アルゴリズムの改善:

行を削除するためだけに配列内のどこまで戻る必要があるかを判断するためだけに、配列内の何千もの要素をループすることは望ましくありません。これは非効率的です。ここで、2 番目のデータ モデルが役立ちます。この 2 番目のデータ モデルは、線を追跡し、配列内のどの要素がその線を構成しているかを格納startend 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すべての行を格納する配列の最後のインスタンスを削除し、必要に応じて行を再描画します。

乗り方を教えてください。

于 2014-12-17T04:05:53.403 に答える