10

我使用适用于 iOS 的谷歌地图 SDK。我的地图上有标记,并且想要设置适当的缩放比例,以便标记是分开的,并且标记应该同时在屏幕上可见。我能够做到。我已经使用逻辑完成,如果所有标记都可见然后放大。但问题是地图相机正在急剧变化。我尝试了很多动画这个缩放,但我没能做到。我尝试了 animateToCameraPosition、animateToZoom 和 UIView 动画方法。

- (BOOL)allCoordinatesVisibleWithLatitudes:(NSArray *)arrayOfLatitudes Longitudes:(NSArray *)arrayOfLongitudes
    {
    CLLocationCoordinate2D coordinate;
    for(int i=0;i<arrayOfLatitudes.count;i++)
    {
        coordinate = CLLocationCoordinate2DMake([[arrayOfLatitudes objectAtIndex:i] floatValue], [[arrayOfLongitudes objectAtIndex:i] floatValue]);
        if(![self.mapView.projection containsCoordinate:coordinate])
        {
            return NO;
        }
    }
    return YES;
}


- (void)setZoomToHaveProperView
{
    NSMutableArray * arrayOfLatitudes = [[NSMutableArray alloc] init];
    NSMutableArray * arrayOfLongitudes = [[NSMutableArray alloc] init];
    RS_SingleMatch * singleMatch = [[RS_SingleMatch alloc] init];
    float zoom = 0.0;

    // You may ignore this first for loop. it just takes coordinate of all markers in     arrays.

    for(int i=0;i<=self.userMatches.arrayOfMatches.count;i++)
    {
        if(i==self.userMatches.arrayOfMatches.count)
        {
            RS_Trip * userTrip = [[RS_Trip alloc] init];
            [arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.fromLat]];
            [arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.fromLon]];
            if(self.segmentedControl.selectedSegmentIndex == 1)
            {
                [arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.toLat]];
                [arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.toLon]];
            }
        }
        else
        {
            singleMatch = [self.userMatches.arrayOfMatches objectAtIndex:i];
            [arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLat]];
            [arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLong]];
            if(self.segmentedControl.selectedSegmentIndex == 1)
            {
                [arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.toLat]];
                [arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.toLong]];
            }
        }
}
    zoom = self.mapView.camera.zoom;

    // if all coordinates are visible then zoom in
    if([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes])
    {
        while ([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes])
        {
            zoom += 0.5;
            [self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]];
            [self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]];
        }
    }
}

我还尝试在 if 条件的 while 循环中颠倒设置 mapview 相机和动画相机的顺序。我花了3天时间才这样做。现在寻求您的帮助。先感谢您。

4

4 回答 4

13

我认为这个问题是调用setCamera将在没有动画的情况下捕捉到新的缩放级别 - 所以下面的调用animateToCameraPosition实际上不会动画任何东西,因为相机已经在那个位置。

但是,如果您删除了对的调用,setCamera那么您可能会陷入无限循环,因为animateToCameraPosition对循环标记仍然是可见的。

您需要做的是计算您需要的最终缩放级别,然后进行一次调用以animateToCameraPosition将相机移动到那里。

我在这里发布了一些代码来计算相机的中心和缩放级别以适应范围:

如何使用适用于 iOS 的 google maps sdk 设置区域?

因此,您可以使用类似的东西来计算适合您的标记到屏幕上的相机位置。

于 2013-03-19T12:19:42.037 回答
11

更简单的答案:

代替

[self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]];
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]];

做这个:

[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]];

为我工作!

于 2014-02-10T22:47:48.400 回答
6
GMSCameraPosition *newCameraPosition = [GMSCameraPosition cameraWithTarget:cordinate zoom:position.zoom];
dispatch_async(dispatch_get_main_queue(), ^{
        [self.mapView animateToCameraPosition:newCameraPosition];
 });
于 2015-03-10T06:09:27.047 回答
3

此代码将 mapview 的相机平滑/动画重新定位到所选标记。

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {

     [mapView animateWithCameraUpdate:[GMSCameraUpdate setTarget:marker.position]];
     mapView.selectedMarker = marker;
     return YES;
}
于 2015-02-18T22:14:51.657 回答