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

Gee*_*eek 10 xcode animation ios6 google-maps-sdk-ios

我使用Google Maps 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]];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试在if条件的while循环中反转设置mapview相机和动画相机的顺序.我花了3天时间做这件事.现在请求你的帮助.先感谢您.

Sax*_*uce 13

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

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

你需要做的是计算你需要的最终缩放级别,然后拨打一个电话animateToCameraPosition来将相机移动到那里.

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

如何使用google maps sdk为iOS设置区域?

所以你可以使用类似的东西来计算一个适合你的标记到屏幕的摄像机位置.


sta*_*lew 11

更简单的答案:

代替

[self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]];
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]];
Run Code Online (Sandbox Code Playgroud)

做这个:

[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]];
Run Code Online (Sandbox Code Playgroud)

适合我!


小智 6

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