【问题标题】:MKMapView: On startup user location -> zoomingMKMapView:在启动用户位置-> 缩放
【发布时间】:2011-08-11 02:12:39
【问题描述】:

我有一个MKMapView,并在地图视图中设置了“显示用户位置”。该应用程序是否应该使用我的位置的问题,我说是的。然后我看到蓝色子弹,我可以缩放到当前位置。

我阅读了许多其他关于此的帖子,但没有解决问题,即用户位置不会自动放大。

如果用户允许访问该位置,我希望在启动时进行缩放,否则定义的坐标应该放大。(之后,是否使用允许该位置,它可以更新,但不应将中心设置为每次我获得位置更新时的用户位置)。

实现此行为的步骤是什么?例如,我尝试过:How do I zoom an MKMapView to the users current location without CLLocationManager? 使用 KVO,但它不起作用...

我希望有人有想法?

最好的问候,蒂姆

【问题讨论】:

  • 对于 iOS 5.0 及更高版本:[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

标签: iphone objective-c


【解决方案1】:

您是否尝试过委托方法 mapView:didUpdateUserLocation:?

我在我的代码中使用了类似的东西:

在.h文件中:

@property (nonatomic, retain) CLLocation* initialLocation;

在.m文件中:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if ( !initialLocation )
    {
        self.initialLocation = userLocation.location;

        MKCoordinateRegion region;
        region.center = mapView.userLocation.coordinate;
        region.span = MKCoordinateSpanMake(0.1, 0.1);

        region = [mapView regionThatFits:region];
        [mapView setRegion:region animated:YES];
    }
}

【讨论】:

  • 我有我的错误,它适用于 4.x,但不适用于 3.x。 :-( 但是,如果 userLocation 不可用(因为没有 GPS 或用户不允许使用该位置),我如何将坐标设置为固定位置?
  • mapView:didUpdateUserLocation: 在 iOS 4.0 及更高版本中可用,所以如果你的目标是 3.x,那你就不走运了。
  • 我在我的应用程序中做了类似的事情,但顺序不同。我首先缩放到默认位置。然后,如果用户允许并且 GPS 得到修复,则缩放到用户位置。如果不是,则地图将停留在默认位置,并且不会发生任何事情。这对你的情况有意义吗?
  • 是的,我认为这比反过来要好得多,因为如果用户允许,但 GPS 不可用(在建筑物内),什么都不会发生。但是如果用户位置改变了,它不应该回到用户位置并在屏幕中居中,否则你不能滚动到其他地方,因为使用你的代码,它总是回到用户位置。可以给我一些代码吗?
  • 我编辑了我的代码,以便地图视图仅在第一次缩放到用户位置。
【解决方案2】:

你可以在你的viewDidLoad中这样写代码

self.mapDetail.showsUserLocation = YES;
[self.mapDetail.userLocation addObserver:self
                            forKeyPath:@"location"
                               options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                               context:nil];

这个方法可以完成任务

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    MKCoordinateRegion region;
    region.center = self.mapDetail.userLocation.coordinate;

    MKCoordinateSpan span;
    span.latitudeDelta  = 1; // Change these values to change the zoom
    span.longitudeDelta = 1;
    region.span = span;

    [self.mapDetail setRegion:region animated:YES];
    [self.mapDetail.userLocation removeObserver:self forKeyPath:@"location"];
}

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2011-11-14
    相关资源
    最近更新 更多