7

我们如何在地图中关注用户。我想让蓝点(用户位置)位于地图的中心,但我还允许用户放大和缩小,然后在几秒钟后放大用户位置。

我对解决方案的有根据的猜测:我们检测用户是否在放大或缩小,在三秒没有放大或缩小检测后,我们开始关注用户:)。你的帮助会很棒:)

此代码放大用户位置,但不会延迟放大和缩小:

     - (void)locationManager:(CLLocationManager *)manager
        didUpdateToLocation:(CLLocation *)newLocation
              fromLocation:(CLLocation *)oldLocation {

  MKCoordinateRegion userLocation = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1500.0, 1500.0); [mapView setRegion:userLocation animated:YES];


    }
4

4 回答 4

14

快速浏览一下文档就会发现其中的魔力。
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

初始化它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];
    }
}
于 2012-11-10T20:36:24.187 回答
2

我有同样的问题。我猜的:

  1. 如果用户拖动地图,他想留在那个位置。
  2. 如果用户什么都不做或重置以显示当前位置,我需要关注用户。

我添加了一个重置​​按钮来显示当前用户位置,如下所示: 在此处输入图像描述

在单击重置按钮时,将其更改needToCenterMapTRUE

在地图上添加了拖动手势识别器

// 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];
}
于 2012-12-27T09:38:52.427 回答
1

我做了一个小例子来展示如何将这项工作委托给 Map 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];
}

然后应用程序看起来像这样: 带有 TrackingMode 的应用 应用程序在 TrackingMode 中缩小

有关更多信息,请阅读 Apple 文档:http: //developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html

于 2012-12-27T09:57:39.453 回答
0

这个外壳可以解决问题:mkMapview.showsUserLocation = YES;

于 2012-12-27T07:53:56.537 回答