我们如何按照地图的用户。 我想有蓝点(用户位置)是在地图的中心,但我也允许用户放大和缩小,什么再经过几秒钟在用户位置回放大。
我对解决方案的猜测:我们发现,如果用户放大或缩小,无缩放的三秒钟后或退出检测,我们开始按照用户:)。 你的帮助将是真棒:)
在用户的位置,但此代码变焦不拖延放大和缩小:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
MKCoordinateRegion userLocation = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1500.0, 1500.0); [mapView setRegion:userLocation animated:YES];
}
我做了一个小例子来说明如何委派这项工作的地图SDK。 当然,你可以听的位置变化,但MKUserTrackingModeFollow自动为您完成此,这样的代码只是一行
#import <MapKit/MapKit.h>
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
//Always center the dot and zoom in to an apropriate zoom level when position changes
[mapView setUserTrackingMode:MKUserTrackingModeFollow];
//don't let the user drag around the the map -> just zooming enabled
[mapView setScrollEnabled:NO];
[self.view addSubview:mapView];
}
然后该应用程序是这样的:
欲了解更多信息,只是阅读苹果文档: http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html
就让我们来看看在文档揭示了魔术。
设置userTrackingMode
您的地图的MKUserTrackingModeFollow
。
见这里 。
更新:
既然你已经更新了你的问题,这里的新的答案。
回到中心将映射出用户的位置,我会建议写一个简单的辅助方法:
- (void)recenterUserLocation:(BOOL)animated{
MKCoordinateSpan zoomedSpan = MKCoordinateSpanMake(1000, 1000);
MKCoordinateRegion userRegion = MKCoordinateRegionMake(self.mapView.userLocation.coordinate, zoomedSpan);
[self.mapView setRegion:userRegion animated:animated];
}
现在,你应该,如果用户停止移动地图在短暂的延迟之后调用它。 你可以在做这个regionDidChange
的MapView的委托方法。
但你可以得到的问题,如果你如果用户多次改变区域之前真的重置地图不锁复位方法。 因此,这将是明智的一个标志,如果有可能回到中心的地图。 就像一个属性BOOL canRecenter
。
使用init它YES
和更新recenterUserLocation
方法:
- (void)recenterUserLocation:(BOOL)animated{
MKCoordinateSpan zoomedSpan = MKCoordinateSpanMake(1000, 1000);
MKCoordinateRegion userRegion = MKCoordinateRegionMake(self.mapView.userLocation.coordinate, zoomedSpan);
[self.mapView setRegion:userRegion animated:animated];
self.canRecenter = YES;
}
现在,你可以安全地调用它的用户移动地图与小延迟任何方式后:
- (void)mapView:(MKMapView *)mMapView regionDidChangeAnimated:(BOOL)animated{
if (self.canRecenter){
self.canRecenter = NO;
[self performSelector:@selector(recenterUserLocation:) withObject:@(animated) afterDelay:3];
}
}
我有同样的问题。 我猜的:
- 如果用户拖动地图,他想留在那个位置。
- 如果用户不执行任何操作或重置显示当前位置,我需要遵循用户。
我添加了一个复位按钮来显示这样的当前用户位置:
在复位按钮点击后,改变了needToCenterMap
到TRUE
添加在地图上拖动手势识别
// Map drag handler
UIPanGestureRecognizer* panRec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didDragMap:)];
- (void)didDragMap:(UIGestureRecognizer*)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateEnded){
NSLog(@"Map drag ended");
self.needToCenterMap = FALSE;
}
}
其次在地图上用户根据needToCenterMap
标志
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
if (self.needToCenterMap == TRUE)
[mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
}
这个壳做的伎俩: mkMapview.showsUserLocation = YES;