地图相机位置急剧变化,没有动画

时间:2013-03-19 11:09:31

标签: xcode animation ios6 google-maps-sdk-ios

我使用谷歌地图SDK for iOS。 我的地图上有标记,并且想要设置适当的缩放以使标记分离,并且标记应该一次在屏幕上可见。 我能够做到。我已经完成了使用逻辑,如果所有标记都可见,那么放大。但问题是地图相机正在急剧变化。我试了很多动画这个缩放,但我做不到。我尝试了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 个答案:

答案 0 :(得分:13)

我认为这个问题是调用setCamera会在没有动画的情况下捕捉到新的缩放级别 - 因此以下对animateToCameraPosition的调用实际上不会对任何内容进行动画处理,因为相机已经是在那个位置。

但是,如果您删除了对setCamera的调用,那么您可能最终会进入无限循环,因为对animateToCameraPosition的调用实际上不会在一段时间之后更新相机(如动画播放),等循环的下一次迭代,标记仍然可见。

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

我发布了一些代码,用于计算摄像机的中心和缩放级别,以适应这里的界限:

How to setRegion with google maps sdk for iOS?

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

答案 1 :(得分: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]]];

适合我!

答案 2 :(得分:5)

GMSCameraPosition *newCameraPosition = [GMSCameraPosition cameraWithTarget:cordinate zoom:position.zoom];
dispatch_async(dispatch_get_main_queue(), ^{
        [self.mapView animateToCameraPosition:newCameraPosition];
 });

答案 3 :(得分:3)

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

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

     [mapView animateWithCameraUpdate:[GMSCameraUpdate setTarget:marker.position]];
     mapView.selectedMarker = marker;
     return YES;
}