无法使用UILongTouchGestureRecognizer从MKMapView获取坐标

时间:2012-11-11 23:36:13

标签: iphone ios ios6 mkmapview uigesturerecognizer

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

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

  1. 创建UILongTouchGestureRecognizer以接收MKMapView的长触摸。

    • 我尝试通过我的故事板添加UILongTouchGestureRecognizer,并通过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检查值时所获得的,无论使用何种方法。       - 对于从UILongPressGestureRecognizer给出的X,Y,x似乎波动到200和420的范围内.Y的范围从约400-700。       - 长时间触摸和触发的纬度和经度奇怪的是,打印到日志中的小数点仅在85.051XX(纬度)和-179.9997XX(经度)之后的第3至第6个十进制值中有所不同。
  4. 以下是我尝试的一些代码的示例

    - (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“,然后(其他我无法工作的东西)在该位置放置一个别针。

1 个答案:

答案 0 :(得分:2)

回顾我在iOS 6中运行的旧项目,我们似乎有几乎完全相同的代码(我猜的源代码教程相同)。不同之处在于我正在检查state并且我的mapView变量未在viewDidLoad中重置。您似乎在手势识别器之后分配了一个新的,并且您没有显示任何将其添加到viewController的代码。我猜你已经设法将屏幕上的那个与代码中的那个分开了。如果您的MKMapview要在viewcontroller的生命周期中显示在屏幕上,那么让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];       
    }

}