MKMapView - 如何检测缩放与拖动事件
MKMapView - How to detect zoom vs drag event
如何检测 MKMapView 上的缩放事件和拖动事件。
我想重新加载地图以防用户drag/scroll映射到新位置。我不想使用缩放 in/out 事件重新加载地图。
您可以通过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");
}
}
我明白了。
缩放或拖动这两种情况调用 regionWillChangeAnimated
和 regionDidChangeAnimated
您想要区分缩放和拖动。
在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));
}
在这个方法中,self
是 mapView
。我的类别是 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
//}
}
我找到了一个解决方案:(。真的很简单
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");
}
}
如何检测 MKMapView 上的缩放事件和拖动事件。
我想重新加载地图以防用户drag/scroll映射到新位置。我不想使用缩放 in/out 事件重新加载地图。
您可以通过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");
}
}
我明白了。
缩放或拖动这两种情况调用 regionWillChangeAnimated
和 regionDidChangeAnimated
您想要区分缩放和拖动。
在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));
}
在这个方法中,self
是 mapView
。我的类别是 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
//}
}
我找到了一个解决方案:(。真的很简单 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");
}
}