10

iOS用のGoogleMapsSDKを使用しています。マップ上にマーカーがあり、マーカーが分離され、マーカーが画面に一度に表示されるように適切なズームを設定したいと考えています。私はそれを行うことができます。すべてのマーカーが表示されている場合はズームインするというロジックを使用しました。しかし、問題はマップカメラが急激に変化していることです。このズームをアニメートするために多くのことを試みましたが、失敗しました。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そこにカメラを移動するために を 1 回呼び出す必要があります。

ここに境界に合わせてカメラの中心とズームレベルを計算するためのコードをいくつか投稿しました。

iOS用のgoogle maps sdkでRegionを設定するには?

したがって、同様のものを使用して、マーカーが画面に収まるカメラ位置を計算できます。

于 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 に答える