MKMapView - 如何检测缩放与拖动事件

时间:2015-11-24 11:11:23

标签: ios objective-c mkmapview

如何在MKMapView上检测缩放与拖动事件。

我想重新加载地图,以防用户想要将地图拖动/滚动到新位置。我不想用放大/缩小事件重新加载地图。

3 个答案:

答案 0 :(得分:2)

我找到了解决方案:(非常简单  1.保持先前的缩放级别。  2.在regionDidChangeAnimated方法中,获取Map的新缩放级别并使用上一级别进行检查。 这是我的代码。

#define MERCATOR_RADIUS 85445659.44705395
#define kVerySmallValue (0.000001)

- (BOOL)compare2Double:(double)first isEqualTo:(double)second {
    
    if(fabs(first - second) < kVerySmallValue)
        return YES;
    else
        return NO;
}
                                              
- (double)getZoomLevel
{
    static double maxGoogleLevels = -1.0;
    
    if (maxGoogleLevels < 0.0)
        maxGoogleLevels = log2(MKMapSizeWorld.width / 256.0);
    
    CLLocationDegrees longitudeDelta = self.mapView.region.span.longitudeDelta;
    CGFloat mapWidthInPixels = self.mapView.bounds.size.width;
    double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapWidthInPixels);
    double zoomer = maxGoogleLevels - log2( zoomScale );
    if ( zoomer < 0 ) zoomer = 0;
    NSLog(@"zoom: %f",zoomer);
    return zoomer;
}
                   
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    
    double newZoom = [self getZoomLevel];
    if ([self compareDouble:newZoom isEqualTo:zoomLevel]) {
        NSLog(@"Drag");
    }else{
        zoomLevel = newZoom;
        NSLog(@"Zoom");
    }
    
}
                                              

答案 1 :(得分:1)

您可以通过以下方法了解PangestureRecognizer

- (void)viewDidLoad
{
   UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragMap:)];
   panGesture.delegate = self;
   [mapView addGestureRecognizer:panGesture];
}

-(void)dragMap:(UIPanGestureRecognizer*) gestureRecognizer
{
   if(gestureRecognizer.state == UIGestureRecognizerStateBegan)
   {
      NSLog(@"The mapView Dragged");
   }
 }

答案 2 :(得分:0)

我理解这个问题。

缩放或拖动两个案例,调用regionWillChangeAnimatedregionDidChangeAnimated来区分缩放和拖动。

MapViewControllerDelegate

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{
    // check mapView.centerCoordinate
    // if mapView.centerCoordinate is equal previousCenterCoordinate {
        // ZOOM
    // } else {
        //pinch gesture
    //}
}

<强>更新

我认为我之前的例子会奏效。但事实并非如此。这是我的第二次尝试。

添加方法getZoomLevel

#define MERCATOR_OFFSET 268435456
#define MERCATOR_RADIUS 85445659.44705395

- (double) getZoomLevel
{
    return 20.00 - log2(self.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * self.bounds.size.width));
}

在此方法中,selfmapView。我的类别为MKMapView,因此我的情况为self

MapViewControllerDelegate

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{
    //  zoomLevel = [mapView getZoomLevel]; // or [self getZoomLevel] in your case
    // if zoomLevel isEqual previousZoomLevel {
        // did drag
    // } else {
        // did zoom
        // previousZoomLevel = zoomLevel
    //}
}