1

マップに線を表示する方法を熱心に考えています。タッチ開始からタッチ終了まで線を引こうとしています。

現時点では、私が触れた場所の座標を取り、それを配列に追加し、最後に触れた場所のコードを取り、それを配列に追加してから線を引きます。これは以下の私のコードです。

悲しいことにコードを実行したとき、私の行は表示されませんでした。しかし、何が欠けているのか疑問に思って座っている間 (座標が配列に保存されているため)、イライラして画面をスワイプし続けたところ、突然線が表示されました! 私はプログラムを閉じて同じことをやり直しました。私が知る限り、線はランダムに、間違った座標で描かれています。

私が変更され

CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
    (startTouch.latitude, startTouch.longitude);

CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
    (startTouch.longitude, startTouch.latitude);

どういうわけか自分の座標を混ぜていたが、同じことが起こっているかどうかを確認する. 線はランダムな位置に描かれています。

誰かがこれを解決するために少し助けてくれれば幸いです。

私はいくつかの作業を行いましたが、これが私が思いついたものです。マップをクリックすると、4 本のライン ポイントが表示されます。それらはタッチの終わり、タッチの始まりです。それらがどこから来ているのかわかりませんが、私のコードからではありません。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches began");

    UITouch *touch = [touches anyObject];

    // Get the specific point that was touched
    CGPoint point = [touch locationInView:self.view];
     //convert toc
    CLLocationCoordinate2D startTouch
    =[self.map convertPoint:point toCoordinateFromView:_map];
    CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake(startTouch.latitude, startTouch.longitude);
    [arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh1]];
    NSLog(@"array: %@", arrayOfLine);
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches END");


    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];
    CLLocationCoordinate2D endTouch
    =[self.map convertPoint:point toCoordinateFromView:_map];
    CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
        [arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
        NSLog(@"array: %@", arrayOfLine);

            MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];

    [_map addOverlay:polygon];
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolylineView *overlayView = [[MKPolylineView alloc] initWithPolyline:overlay];

        overlayView.strokeColor     = [[UIColor blueColor] colorWithAlphaComponent:0.7];
        overlayView.lineWidth       = 3;

        return overlayView;
    }

    return nil;
}

ここに画像の説明を入力

4

1 に答える 1

0

ランダムな行、問題のコードから来ています。

主な問題はtouchesEnded、このセクションにあります。

CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
[arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
NSLog(@"array: %@", arrayOfLine);

MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];


を呼び出すpolylineWithCoordinatesと、コードは単一の構造体のアドレスを指定しますがobhオブジェクト CLLocationCoordinate2Dcount数に設定されているarrayOfLine可能性が最も高いのは 2 つです (タッチ開始 + タッチ終了)。

このpolylineWithCoordinatesメソッドは、構造体の単純な C 配列をCLLocationCoordinate2D想定しています。

現在、コードはメソッドに単一の構造体のみを提供していますが、カウントは、配列内の座標として単一の構造体に続くメモリ内のバイトも使用するようにメソッドに指示します。次のメモリ内のバイトは、obh無意味な座標に変換されるランダムな値になる可能性が高いため、ランダムな行が得られるか、行がまったく得られません。


arrayOfLineこれを修正するには、 (目的の C ) からプレーンな C 配列を作成する必要がありますNSArray
これを行う1つの方法は次のとおりです。

//REPLACE this existing line with the code below:
//MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];

CLLocationCoordinate2D coords[arrayOfLine.count];

for (int c = 0; c < arrayOfLine.count; c++)
{
    NSValue *v = [arrayOfLine objectAtIndex:c];
    coords[c] = v.MKCoordinateValue;
}

MKPolyline *polygon = [MKPolyline polylineWithCoordinates:coords count:[arrayOfLine count]];


問題を直接引き起こさない他のいくつかのポイント:

  1. ではtouchesBegan、作成obh1は不要です。 startTouchはすでにCLLocationCoordinate2D配列に追加できる です。
  2. ではtouchesEnded、作成obhは不要です。 endTouchはすでにCLLocationCoordinate2D配列に追加できる です。
  3. 現在、arrayOfLineどの時点でもクリアされていません。これは、タッチが終了するたびに、ユーザーが描いたすべての線が再描画される (そして一緒に接続される) ことを意味します。意図は不明ですが、現在の begin+end タッチ ペアのみを描画する場合は、 の上部でtouchesBeganを実行します[arrayOfLine removeAllObjects];
  4. userInteractionEnabledマップ ビューで が に設定されていることを確認してください。NOそうしないと、タッチ メソッドに干渉し、奇妙な動作 (touchesEnded呼び出されないなど) が発生する可能性があります。
于 2014-12-14T13:25:49.733 に答える