地图视图不更新摄像机位置,也不使用animateToLocation

时间:2015-01-28 16:41:01

标签: ios objective-c google-maps xcode6 google-maps-sdk-ios

这是一篇很长的文字,所以我提前感谢你。

我有两个视图控制器:

  1. MainViewController:有一个带有搜索文本字段的Google地图视图,其中用户输入城市名称并且位置更改为该城市,我使用一种方法,使用谷歌的地理编码服务将城市名称转换为纬度和经度。这里一切正常。
  2. SelectAreaViewController:使用push segue访问此VC,它有一个带有8个简单行(区域)的选择器视图。当用户选择一行时,它会自动关闭,然后在MainViewController上执行一个方法来更新地图视图位置。这是问题所在。执行该方法但不更新地图视图位置。我尝试过使用animateToLocation并设置“camera”属性,但它无效。
  3. 我甚至尝试在视图加载时执行该方法并且它工作正常,所以问题是当从其他viewcontroller调用该方法时,我猜这是一个segue问题但我在谷歌或SO上找不到任何东西

    这是应该更新位置的MainViewController方法。我再说一遍,该方法已执行,但mapview没有响应位置更改方法(animateToLocation)和相机设置。

    -(void)setPlazaOnMap:(NSInteger)plazaNum
    {
        double lat;
        double lng;
        NSString *plazaNombre;
    
        switch (plazaNum) {
            case 0:
                NSLog(@"Plaza 1");
                plazaNombre = @"Aguascalientes";
                lat = 21.8852562;
                lng = -102.2915677;
                break;
    
            case 1:
                NSLog(@"Plaza 2");
                plazaNombre = @"León";
                lat = 21.1250077;
                lng = -101.6859605;
                break;
            case 2:
                NSLog(@"Plaza 3");
                plazaNombre = @"San Luis Potosí";
                lat = 22.1564699;
                lng = -100.9855409;
                break;
            case 3:
                NSLog(@"Plaza 4");
                plazaNombre = @"Querétaro";
                lat = 20.5887932;
                lng = -100.3898881;
                break;
            case 4:
                NSLog(@"Plaza 5");
                plazaNombre = @"Monterrey";
                lat = 25.6866142;
                lng = -100.3161126;
                break;
            case 5:
                NSLog(@"Plaza 6");
                plazaNombre = @"Saltillo";
                lat = 25.4267244;
                lng = -100.9954254;
                break;
            case 6:
                NSLog(@"Plaza 7");
                plazaNombre = @"Torreón";
                lat = 25.5428443;
                lng = -103.4067861;
                break;
            case 7:
                NSLog(@"Plaza 8");
                plazaNombre = @"Cancún";
                lat = 21.161908;
                lng = -86.8515279;
                break;
            case 8:
                NSLog(@"Plaza 9");
                plazaNombre = @"Guadalajara";
                lat = 20.6596988;
                lng = -103.3496092;
                break;
    
            default:
                lat = 20.6596988;
                lng = -103.3496092;
                break;
        }
    
        NSLog(@"lat %f",lat);
        NSLog(@"lng %f",lng);
    
    
        GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:lat longitude:lng zoom:12];
        self.mapView.camera = camera;
    
    //  [self.mapView animateToLocation:CLLocationCoordinate2DMake(lat, lng)];
    //  [self.mapView animateToZoom:10];
    
    }
    

    第二个viewcontroller中的方法是:

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        MainViewController *mainvc = [[MainViewController alloc] init];
    
        [mainvc setPlazaOnMap:row];
    
    
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    再次,先谢谢。

2 个答案:

答案 0 :(得分:1)

当您的应用启动时,您在导航控制器的堆栈上有一个MainViewController实例。

然后将SelectViewController的实例推送到堆栈上。

在didSelectRow方法中弹出SelectViewController,它会将您带回到MainViewController的原始实例。

问题是你的didSelectRow方法正在分配一个新的MainViewController实例,然后在其上调用setPlazaOnMap,而不是在原始实例上调用它。

要获得原始实例,您需要这样的内容:

UIViewController* rootViewController = [self.navigationController.viewControllers objectAtIndex: 0];
MainViewController* mainViewController = (MainViewController*)rootViewController;

然后调用setPlazaOnMap。

答案 1 :(得分:0)

您可以尝试更改

self.mapView.camera = camera;

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; self.view = self.mapView;