iOS/Obj-C:将Google Map加载到自定义UIView出现空白问题求助
问题原因与解决方案:自定义UIView中Google Map显示空白
我一眼就看出问题所在了——你覆盖了自己的IBOutlet引用,导致Storyboard/XIB里的自定义UIView根本没被用上,自然显示空白。
问题核心分析
你已经在.h文件里声明了IBOutlet GMSMapView *mapView,这说明你应该是在界面编辑器里把一个自定义UIView(设置了类为GMSMapView)和这个属性做了连接。但在viewDidLoad里,你写了这行代码:
self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:self.camera];
这直接创建了一个全新的GMSMapView实例,覆盖了原来的IBOutlet引用,然后你把这个新视图加到了self.view上——而你原本想使用的那个自定义UIView(Storyboard里的)完全没被赋值和配置,所以它只能显示空白。
修复后的代码
把viewDidLoad里的代码修改成这样,直接使用已连接的IBOutlet实例:
-(void)viewDidLoad { [super viewDidLoad]; // 别忘了调用父类方法! // 1. 给已有的mapView设置相机参数 self.camera = [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:12]; self.mapView.camera = self.camera; // 2. 配置地图设置 self.mapView.settings.compassButton = YES; self.mapView.settings.myLocationButton = YES; [self.mapView addObserver:self forKeyPath:@"myLocation" options:NSKeyValueObservingOptionNew context:NULL]; // 3. 加载地图样式 NSBundle *mainBundle = [NSBundle mainBundle]; NSURL *styleUrl = [mainBundle URLForResource:@"style" withExtension:@"json"]; NSError *error; GMSMapStyle *style = [GMSMapStyle styleWithContentsOfFileURL:styleUrl error:&error]; NSLog(@"This is what %@", style); if (!style) { NSLog(@"The style definition could not be loaded: %@", error); } else { NSLog(@"Style Loaded"); } self.mapView.mapStyle = style; // 4. 启用我的位置(主线程执行) dispatch_async(dispatch_get_main_queue(), ^{ self.mapView.myLocationEnabled = YES; }); }
额外注意事项
- 确保你在Storyboard/XIB里的自定义UIView的类已经设置为
GMSMapView - 检查IBOutlet连接是否正确:右键点击
mapView属性,确认它已经和界面上的视图建立了连接 - 不要忘记调用
[super viewDidLoad];,这是UIViewController生命周期的必要步骤
这样修改后,你的自定义UIView就会正确加载配置好的Google Map了。
内容的提问来源于stack exchange,提问作者Brittany
相关产品推荐
相关产品推荐

