1

私はiOS6を使用していますが、これを達成するための数十の方法(スタックオーバーフローからの多くの方法を含む)を読みましたが、成功しませんでした。

これが私が試したもので、「ステージ」に分けられています。

  1. UILongTouchGestureRecognizerのロングタッチを受け取るためにを作成しますMKMapView

    • ストーリーボードを介してビアを追加しUILongTouchGestureRecognizer、接続インスペクターを介してアウトレットやデリゲートなどを接続してみました。
    • UILongTouchGestureRecognizerプログラムで作成し、mapViewターゲット、selfターゲット、およびターゲットとして使用して初期化してみましたself.view
  2. からselectorメソッドを使用してタッチジェスチャを受け取り、UILongTouchGestureRecognizerを取得しCGPointて、オブジェクトに変換しCLLocationCoordinate2Dます。

    • 私はもう試した:
      • [mapView convertPoint:(CGPoint)toCoordinateFromView:self.mapView]を使用します。
      • MKMapPoint aPoint = MKMapPointMake(aCGPoint.x, aCGPoint.y);最初に使用し、次にを使用 しMKCoordinateForMapPoint(aMapPoint)てを取得しCLLocationCoordinate2Dます。
      • UILongPressGestureRecognizerに直接アクセスすることと(UILongPressGestureRecognizer *)sender、メソッド呼び出しからfromを使用してCGRectのx、yを取得することの両方。
  3. 結果

    • 一言で言えば、使用する方法に関係なく、を使用して値をチェックするときに得たものですNSLog。-、から与えられたX、Yの場合UILongPressGestureRecognizer、xは200から420の範囲で変動しているようです。Yの範囲は約400〜700です。-長いタッチによってトリガーされ、ログに印刷された緯度と経度は、奇妙なことに、85.051XX(緯度)および-179.9997XX(経度)の小数点以下の3番目から6番目の小数点以下の値でのみ変化します。

これが私が試したコードの例です

- (void)viewDidLoad
{
     NSLog(@"View did load");
    [super viewDidLoad];
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:mapView action:@selector(handleLongPress:)];
    mapView = [[MKMapView alloc] init];
}

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender
{
    NSLog(@"CGPoint point: x - %f y - %f", point.x, point.y);
    CGPoint point = [sender locationInView:self.mapView];
    CLLocationCoordinate2D locCoord = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
    NSLog(@"Coords from \"locCoord\": lat - %f lng - %f", locCoord.latitude, locCoord.lon);

    MKPointAnnotation *addAnnotation = [[MKPointAnnotation alloc] init];

   [addAnnotation setCoordinate:
   [self.mapView addAnnotation:addAnnotation];
}

私はこれに完全に困惑しているので、誰かが私を助けてくれることを願っています。

繰り返しになりますが、最終的な目標は、ユーザーが「mapViewを長押しした」場所の座標を取得し、その場所にピンをドロップすることです。

4

1 に答える 1

2

iOS 6で動作する私の古いプロジェクトを振り返ると、ほぼ同じコードがあるようです(同じソースチュートリアルだと思います)。違いは、をチェックしているstateことと、mapView変数がviewDidLoadでリセットされていないことです。ジェスチャ認識機能の後に新しいものを割り当てているようで、viewControllerに追加するためのコードが表示されていません。画面上のものとコード内のものをうまく分離できたと思います。MKMapviewがビューコントローラの存続期間を通じて画面に表示されることを意図している場合は、IBに割り当てと割り当てを管理させます。

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateBegan)
    {
        CGPoint point = [recognizer locationInView:mapView];
        CLLocationCoordinate2D locCoord = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
        [self addPinAtLocation:locCoord];       
    }

}
于 2012-11-12T01:28:53.677 に答える