2015-11-24 18 views
-1

如何在MKMapView上检测变焦与拖动事件。MKMapView - 如何检测变焦与拖动事件

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

+1

Robert TuanVu我更新了我的编码,请检查它。 – user3182143

+1

我之前使用过的代码:)没什么。它检测到drap和zoom –

回答

1

我找到了解决办法:(。很简单 1.保留以前的缩放比例。 2. regionDidChangeAnimated方法,获得地图的新缩放级别,并与检查先前的水平。 这是我的代码。

#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

您可以通过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"); 
    } 
} 
+0

它没有帮助。 regionDidChangeAnimated方法同时触发缩放和拖动。 我只想捕捉拖动事件。 –

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 
    //} 
} 
+0

mapView.centerCoordinate =>一直改变 –

+0

@RobertTuanVu答案已更新。 –