1

我正在使用 iOS 6,并且我已经阅读了数十种方法来实现这一点(包括许多来自堆栈溢出的方法),但都没有成功。

这是我尝试过的,分为“阶段”:

  1. 创建一个UILongTouchGestureRecognizer以接收长按MKMapView

    • 我尝试UILongTouchGestureRecognizer通过我的 Storyboard 添加一个,并通过 Connections Inspector 连接插座、代表等。
    • 我尝试以UILongTouchGestureRecognizer编程方式创建它,将其初始化mapView为目标、self目标和self.view目标。
  2. 使用 中的选择器方法接收触摸手势UILongTouchGestureRecognizer,获取CGPoint,并将其转换为CLLocationCoordinate2D对象。

    • 我试过了:
      • 使用 [mapView convertPoint:(CGPoint) toCoordinateFromView:self.mapView];
      • 首先使用MKMapPoint aPoint = MKMapPointMake(aCGPoint.x, aCGPoint.y);,然后使用 MKCoordinateForMapPoint(aMapPoint)来获取CLLocationCoordinate2D.
      • 两者都直接访问 UILongPressGestureRecognizer 并使用(UILongPressGestureRecognizer *)sender方法调用获取 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 回答