ios 8 中不支持的帧缓冲区格式

Unsupported framebuffer format in ios 8

场景是基本的: 有 2 个视图控制器 - 一个普通的(里面只有一个按钮)和一个带有 mapkit mapview 的 mapview 控制器。

在地图中有一个带有标注的注释,单击该标注时会将普通视图控制器推送到导航控制器。在普通控制器中,单击按钮时,它会推送 mapview 控制器(一个新实例)。

如此操作大约22次导致地图瓦片不显示,地图视图闪烁。如果回到以前的地图控制器,地图显示和操作正常。

出现闪烁时,debug多次打印出此错误

ERROR /SourceCache/VectorKit/VectorKit-992.19/GeoGL/GeoGL/GLCoreContext.cpp 1251: Unsupported framebuffer format

这是用 ipad 4,ios 8.1.3

完成的

这是一个已知问题吗?

您有 21 个 Map Kit 视图控制器。每个视图控制器都设置了一个帧缓冲区来渲染矢量图数据。当您的设备尝试设置最后一个视图控制器时,它无法再分配一个缓冲区。但是代码会继续执行一段时间。然后一些其他代码尝试使用该错误缓冲区,并发出您看到的错误。

解决这个问题的方法是不要制作那么多 Map Kit 视图控制器。不要推送新的视图控制器,而是使用 UINavigationController- setViewControllers:animated: 方法来交换您的两个控制器。你现在只是推送你的视图控制器的一个新副本,尝试这样的事情:

NSMutableArray *vcArray = [self.navigationController.viewControllers mutableCopy];
if (vcArray.count > 1) {
    UIViewController *backVC = vcArray[vcArray.count - 2];
    vcArray[vcArray.count - 2] = self;
    vcArray[vcArray.count - 1] = backVC;
    [self.navigationController setViewControllers:vcArray animated:YES];
} else {
    [self.navigationController pushViewController:[self otherVC] animated:YES];
}

这假设您有一个方法 -otherVC 可以提供适当的视图控制器。这也假设只使用了这两个视图控制器,因此您可能想要更改 if 语句以适应您应用程序功能的逻辑。

我能想到您真正需要 21 个不同的 Map Kit 视图控制器的唯一原因是每个视图控制器都需要在地图上显示不同的位置。使用其他方法存储每个视图控制器的位置,然后在每次显示时将该信息推送到一个地图。您可以保存一些值,例如地图的位置和放大率,而不是设置完整地图视图控制器所需的所有额外存储。