回答
我找到了解决办法:(。很简单 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");
}
}
您可以通过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");
}
}
它没有帮助。 regionDidChangeAnimated方法同时触发缩放和拖动。 我只想捕捉拖动事件。 –
的方法,下面我理解这个问题找到答案。
缩放或拖动您想要区分放大和拖动的两种情况,请调用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
//}
}
mapView.centerCoordinate =>一直改变 –
@RobertTuanVu答案已更新。 –
- 1. 如何检测全局拖动事件?
- 2. 检测结束拖动/缩放MKMapView
- 3. 如何检测拖动事件的方向?
- 4. 如何检测UITableView的拖动结束事件?
- 5. 如何从pdf.js检测滚动事件
- 6. iScroll 5,如何检测滚动事件
- 7. 如何检测“向下滚动”事件
- 8. 如何在iOS中结束拖动事件之前检测滚动更新?
- 9. 如何拖动MKMapView被拖动的注释? (iOS)
- 10. 如何检测tinyMCE textarea模糊/聚焦事件?
- 11. 如何检测进入和离开窗口的HTML5拖动事件,例如Gmail?
- 12. p:inputMask如何检测事件
- 13. 如何检测MKMapView缩小/放大?
- 14. 如何知道MKMapView上的regionChange事件是MKMapView的程序化还是用户拖动?
- 15. D3:火变焦事件(或模拟变焦事件)
- 16. 在HTML5本机拖动过程中检测keydown/up事件
- 17. 如何检测长按事件拖动和重新排列angularjs中的元素
- 18. 如何拖动JavaFX节点并检测JavaFX Windows之外的放置事件?
- 19. 如何设置检测与可拖动功能?
- 20. iFrame滚动事件检测
- 21. 检测滚动事件(pdfnet)
- 22. 检测keydown事件(移动)
- 23. wxgrid,检测滚动事件
- 24. 检测动画的结尾上的MKMapView
- 25. 如何使用jsTestDriver在焦点事件中测试焦点
- 26. 如何改变焦点事件与蟒蛇的xlib
- 27. 窗口检测被拖动的文件?
- 28. jQuery的 - 可拖动的div变焦
- 29. Jfree图表鼠标拖动到变焦
- 30. Fancybox变焦拖动不工作
Robert TuanVu我更新了我的编码,请检查它。 – user3182143
我之前使用过的代码:)没什么。它检测到drap和zoom –