userLocation 上的中心 MKMapView(最初) - 仅适用于 iPhone 4?

Posted

技术标签:

【中文标题】userLocation 上的中心 MKMapView(最初) - 仅适用于 iPhone 4?【英文标题】:Center MKMapView on userLocation (initially) - only works on iPhone 4? 【发布时间】:2011-02-23 22:31:53 【问题描述】:

我实现了以下 MKMapView 方法,该方法在添加注释后运行。我在 Interface Builder 中将我的 MKMapView 地图(parishMap)设置为“显示用户位置”,并且在加载地图视图时,蓝点总是在一秒钟左右出现在地图视图上。

这是我在 Map View 控制器实现中的代码:

// Center map on user location (initially)
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 
    for(MKAnnotationView *annotationView in views) 
        if(annotationView.annotation == parishMap.userLocation) 
            MKCoordinateRegion region;
            MKCoordinateSpan span;

            span.latitudeDelta=0.03;
            span.longitudeDelta=0.03;

            CLLocationCoordinate2D location=parishMap.userLocation.coordinate;

            location = parishMap.userLocation.location.coordinate;

            region.span=span;
            region.center=location;

            [parishMap setRegion:region animated:TRUE];
            [parishMap regionThatFits:region];
        
    

当我在 iPhone 4 上打开地图视图时,地图视图总是(并且几乎立即)移动到 userLocation 点的中心。但是,当我在 iPhone 3Gs 或 iPod Touch (2010) 上打开地图视图时,它不会以 userLocation 为中心,而是停留在我为地图视图设置的默认缩放/区域。

关于为什么此代码不适用于非 iPhone 4 设备(它们都运行 4.2.x 最新的 ios)的任何想法?

【问题讨论】:

另外,我有一个按钮,用于从 parishMap.userLocation.location 中获取值,该按钮可用于在任何设备上更新 parishMap。跨度> 【参考方案1】:

这可能与 GPS 在这些不同设备上锁定位置所需的时间有关。

我建议使用 CLLocationManager 及其委托方法来使地图居中。

您可以通过创建 CLLocationManager 的实例,将其委托属性设置为 self 然后实现来开始更新位置:

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

您可以根据最新的位置更新相应地将地图居中。

【讨论】:

这是最好的方法,在大多数情况下,我使用这种方法可以更好地工作,但我将保留我的代码(原始帖子)以防 4.3 允许它在所有 iOS 设备上工作。对我来说似乎更简单。【参考方案2】:

您是否尝试过使用此代码使地图居中:

[mapView setCenterCoordinate:location animated:YES];

我不确定为什么它适用于 iPhone 4 而不是其他设备,但这是我用来调整区域的代码:

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(location, 0.03, 0.03);
    MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];

    [mapView setRegion:adjustedRegion animated:YES];

试试这个方法,看看它是如何工作的。您执行 regionThatFits 方法的方式实际上不应该是该方法的使用方式。您可以尝试注释掉代码的最后一行,它应该没有什么区别。不管怎样,用我刚才给的方法试试看,有什么问题可以告诉我。

【讨论】:

删除 regionThatFits 行并不会破坏事情,所以我已经永久删除了它。但是,使用 setCenterCoordinate,iPod touch 仍然不会更新它的位置。是否与设备需要更长的时间才能获得准确位置有关? Hmm... 看起来问题可能是当用户位置 pin 掉线时 didAddAnnotationViews 没有被调用。现在我想起来了,我的 iPhone 4 正在运行 iOS 4.3 测试版——也许 Apple 重新添加了该功能?见 (***.com/questions/4840015/…)... @geerlingguy 您的问题可能与设备锁定位置不够快有关。我已经添加了我的答案供您考虑。 Rog 的建议实际上是我这样做的方式,但我想我会帮助您按照您想要的方式解决它。苹果可能已经解决了新测试版的一些问题。您是否尝试在其他设备上安装测试版?根据你链接到的那个问题,我建议走罗格和我自己走的同一条路。它干净了很多。如果你想知道如何做到这一点,请告诉我,我会为你写一个新的答案。

以上是关于userLocation 上的中心 MKMapView(最初) - 仅适用于 iPhone 4?的主要内容,如果未能解决你的问题,请参考以下文章

userLocation 与 CLLocation 如此不同

MKMapView 显示UserLocation 默认是灰点,不是蓝点

MKMapkit 将 userLocation 注解居中在另一个其他视图坐标中

两列上的 SQL 索引

iPhone 地图应用程序“位置广场”

无效的用户位置 iPhone MapKit