试图预加载Google地图视图

时间:2014-09-23 00:44:53

标签: ios google-maps-sdk-ios

我在Tabbar控制器上的导航控制器内部的视图控制器中有一个Google Map View。一切正常,但是当我最初点击地图选项卡时,地图上的加载时间范围为5-10秒。

storyboard-layout

我遇到了几个StackOverflow帖子,其中列出了以下预加载标签的方法:

for (UIViewController *viewController in self.tabBarController.viewControllers)
{
    [viewController view];
}

我已将其修改为我的特定实现。

for (UIViewController *viewController in self.tabBarController.viewControllers)
{
    UINavigationController *navCon = (UINavigationController*)viewController;
    for (UIViewController *vc in navCon.viewControllers) {
        if ([[NSString stringWithFormat:@"%@",vc.class]  isEqual: @"MapViewController"]){
            MapViewController *mv = (MapViewController*) vc;
            [mv view];
        }

    }
}

不幸的是,两种实现都没有预先加载地图选项卡。

功能

  • Google Maps SKD 1.7.2
  • iOS SDK 7.1

编辑 MapViewController.m上的ViewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];
    mapView_ = [GMSMapView mapWithFrame:self.view.bounds camera:nil];
    mapView_.delegate = self;
    AppDelegate *appDelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;
    CLLocationCoordinate2D loc=appDelegate.locationManager.location.coordinate;

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:loc.latitude
                                                            longitude:loc.longitude
                                                                 zoom:12];
    [mapView_ setCamera:camera];
    mapView_.myLocationEnabled=YES;
    mapView_.settings.myLocationButton = YES;
    self.view = mapView_;
}

2 个答案:

答案 0 :(得分:4)

我建议只使用容器视图(long how-to),这很容易;然后它将可靠地独立工作。如果您愿意,只需在加载时将其移出屏幕(也许可以在之后将其滑入)。

请注意,在容器视图中,假设“父”是Boss类,

@implementation SomeContaineredView
-(void)allTheDataLoaded
    {
    [(Boss*)self.parentViewController someMethodInBoss];
    }
@end

与父类交谈很容易。


注意 - 如果你需要将从父母传播到容器视图,如果你知道Apple让你做的“愚蠢技巧”,那就很容易了。https://stackoverflow.com/a/15706092/294884

这有点令人讨厌,对于这样一个基本的操作,你总是做得很好。你在prepareForSegue中这样做:像这样......

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    if ([segue.identifier isEqualToString:@"containerLogin"])
        self.vcLogin = (LoginVC *)segue.destinationViewController;

    if ([segue.identifier isEqualToString:@"containerStartNew"])
        self.vcStartNew = (StartNewVC *)segue.destinationViewController;

    }

在示例中有两个容器视图。 (使用标识符“containerLogin”和“containerStartNew”)所以,我有两个属性(self.vcLogin,self.vcStartNew)。这正是你设置它们的方式。

请注意, prepareForSegue 命名错误。它应该被称为“设置,当你有一个嵌入segue时运行”我在这里详细解释:https://stackoverflow.com/a/24351813/294884

重要! ...

这是一个方便的宏!!!

#define seg(A, B, C) if ([segue.identifier isEqualToString:A]) \
                           B = (C *)segue.destinationViewController;

在我们开展的每个项目中,我们都使用该宏。

然后你可以简单地写一下:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    seg(@"cOverlayBuy", self.rockets, Rockets);
    seg(@"cOverlayMainMenu", self.overlayMainMenu, OverlayMainMenu);

    seg(@"cSearch", self.search, Search);
    seg(@"cMeeting", self.meeting, Meeting);

    seg(@"cMeetings", self.meetings, Meetings);
    seg(@"cBooks", self.bikes, Bikes);
    seg(@"cPeople", self.cars, Cars);
    }

因为,现在,每个场景都有许多容器视图,我们拥有的每个场景,对于每个客户端,在“prepareForSegue”调用中都有该代码。

因此,一旦该代码运行,您最终可以“访问容器视图!”

[self.cars displayColors:@"red"];
self.cars.view.hidden=YES;
[self.meetings calculateNewTimesNow];

......等等。

就像我说的,我们在每个项目中都使用这个宏。几乎每个场景现在都有几个容器视图,因此它存在于每个VC中!希望它可以帮到某人。

答案 1 :(得分:0)

我认为您可以在该视图之前实例化它,然后在加载该控制器时使其显示。如果你不能,也许你可以远离当前视图创建它,然后在满载时将其滑入? (并使其看起来光滑)