如果在主页按钮位于右侧时以横向模式初始化,iOS MKMapView 将显示空白地图
Posted
技术标签:
【中文标题】如果在主页按钮位于右侧时以横向模式初始化,iOS MKMapView 将显示空白地图【英文标题】:iOS MKMapView shows blank map if initialized in landscape mode while home button is on the right 【发布时间】:2016-01-26 14:00:58 【问题描述】:我正在尝试将 MKMapView 与基于 Cordova 的应用程序一起使用,除了当我在设备处于横向模式且主页按钮位于右侧时使用代码初始化它时,一切似乎都运行良好:
MKMapView* mapView = [[MKMapView alloc]initWithFrame:CGRectMake(200, 62, 824, 708)];
地图显示为空白,地图一角仅显示“法律”字样。
奇怪的是,当主页按钮在左侧并且仍处于横向模式时,调用上面相同的代码显示地图没有问题。
在纵向模式下,它每次都能正常工作...
另外需要注意的是,在纵向模式下正确初始化后,再次将设备旋转到横向模式将起作用。此外,它只发生在我拥有的 iPad 4、iPad mini 和 iPhone 5(公司设备,不是我的设备)上,而 iPhone 6 Plus 没有这个问题。然而,在 iPhone 6 Plus 上,地图的坐标在横向模式下也会出现,这意味着如果我给它一个坐标以使地图居中,它会在错误的位置居中,但是在纵向模式或主页按钮打开时左边它正确居中!我想知道这两个问题是否相关..
这是 ios 错误吗?还是和科尔多瓦有关?
【问题讨论】:
【参考方案1】:看起来地图框没问题,但地图没有渲染。
在 ViewController 中为 mapView 设置委托:mapView.delegate = self;
并在您可以查看地图的地方实现这些方法:
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
// here you can catch error if map failed
- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView
// here you can see when map starts loading
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
// here you can see when map finishes loading
【讨论】:
刚试过这个,在纵向模式下,我验证了 mapViewWillStartLoadingMap 首先被调用,然后 mapViewDidFinishLoadingMap 在地图显示之前被调用。然而,在横向模式的问题方面,这些函数都没有被调用,包括 mapViewDidFailLoadingMap.. 尝试其他委托方法- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered;
只有 mapViewDidFinishRenderingMap 使用fullyRendered = YES调用【参考方案2】:
我有点想通了。
这是由..的组合引起的。
Cordova 状态栏插件 -> 状态栏设置为在横向模式下隐藏 iOS 9 设备在横向模式下旋转,右侧有 Home 按钮 MKMapView 边界计算错误,导致它在设备屏幕之外呈现问题的根源就在线上:
MKMapView* mapView = [[MKMapView alloc]initWithFrame:CGRectMake(200, 62, 824, 708)];
如果你用708加上62,就等于770px,而我的设备只有768px的高度,它在设备屏幕之外渲染了2px。
必须满足其中 4 个条件才能发生。
如果设备不在横向模式下,右侧 Home 按钮,或者如果它在 iOS 8 上,或者如果你没有使用 cordova 状态栏插件(或类似的东西),或者边界设置正确,它不会发生。
难怪我在谷歌上搜索并没有发现有类似问题的人>.
希望这些信息对某人有所帮助.. 但我对此表示怀疑。
最后我选择修复我的边界计算并且永远不会让它呈现在设备屏幕之外,并且一切正常。
【讨论】:
以上是关于如果在主页按钮位于右侧时以横向模式初始化,iOS MKMapView 将显示空白地图的主要内容,如果未能解决你的问题,请参考以下文章