自定义标记器性能iOS,崩溃,结果为“;((null))为false:已达到纹理地图集的最大数量,无法分配更多。”;
我已经在我的应用程序中集成了谷歌地图,还使用了谷歌地图API。在我从GooglePlacesAPI(大约60个)获得所有结果之后,我将在自定义标记的帮助下显示它们。我正在制作的自定义标记由“地点图像”和“地点名称”组成,因此我必须首先在UIView中绘制它,然后借助以下函数将其呈现为UIImage自定义标记器性能iOS,崩溃,结果为“;((null))为false:已达到纹理地图集的最大数量,无法分配更多。”;,ios,objective-c,google-maps,uiimage,google-maps-markers,Ios,Objective C,Google Maps,Uiimage,Google Maps Markers,我已经在我的应用程序中集成了谷歌地图,还使用了谷歌地图API。在我从GooglePlacesAPI(大约60个)获得所有结果之后,我将在自定义标记的帮助下显示它们。我正在制作的自定义标记由“地点图像”和“地点名称”组成,因此我必须首先在UIView中绘制它,然后借助以下函数将其呈现为UIImage - (UIImage *)imageFromView:(UIView *) view { if ([[UIScreen mainScreen] respondsToSelector:@sele
- (UIImage *)imageFromView:(UIView *) view
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]);
} else {
UIGraphicsBeginImageContext(view.frame.size);
}
[view.layer renderInContext: UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
首先,所有标记都很容易渲染和绘制
现在,我有一个从100米到5公里的滑块,它可以作为搜索半径优化器。由于滑块将被移动(假设值为2km),因此将删除所有标记,并且仅再次绘制距离用户位置小于滑块值的标记。当我测试滑块功能时,应用程序崩溃了
((null))为false:已达到纹理地图集的最大数量,无法分配更多
我上传屏幕截图以清楚地了解情况。
请帮忙
同样值得一提的是,在屏幕上,您将看到绿色标记和蓝色标记。蓝色标记是距离用户位置较近的标记,而绿色标记则距离用户位置较远。由于用户位置将发生变化,有两种情况:
我正在开发一个应用程序,它可以让数千个头像在地图上移动,同时也会遇到这个bug。集群是一个潜在的解决方案,但随着这么多化身都在移动,我怀疑计算将过于CPU密集 我使用的解决方案是保留对基本化身图像的引用,并在屏幕上有>50个化身时使用它。只有当屏幕上有<50个头像时,我才会为每个头像生成带有其名称的唯一图像
// GMSMarker
static var avatarDic:[String:UIImage] = Dictionary()
func removeName() {
// use a single image reference here so that google map does not crash
if let image = avatarDic[avatarBase] {
self.icon = image
}
else {
avatarDic[avatarBase] = UIImage(named:avatarBase)
self.icon = avatarDic[avatarBase]
}
}
func addName() {
self.icon = // draw name on base image
}
// GMSMapView
var userIcons:[String:MyMarker] = Dictionary()
var iconWithNames:Set<MyMarker> = Set()
func mapView(mapView: GMSMapView!, didChangeCameraPosition position: GMSCameraPosition!) {
// find visible avatars til limit
let bottomLeft = self.mapView.projection.visibleRegion().nearLeft
let topRight = self.mapView.projection.visibleRegion().farRight
var visibleMarkerSet:Set<MyMarker> = Set()
for (key, marker) in self.userIcons {
if (marker.position.latitude > bottomLeft.latitude && marker.position.latitude < topRight.latitude && marker.position.longitude > bottomLeft.longitude && marker.position.longitude < topRight.longitude) {
visibleMarkerSet.insert(marker)
}
// not showing if > 50
if (visibleMarkerSet.count > 50) {
visibleMarkerSet = Set()
break
}
}
// remove names
for markerWithName in self.iconWithNames {
if (visibleMarkerSet.contains(markerWithName) == false) {
markerWithName.removeName()
}
}
// add names
for visibleMarker in visibleMarkerSet {
visibleMarker.addName()
}
self.iconWithNames = visibleMarkerSet
}
//GMSMarker
静态变量avatarDic:[字符串:UIImage]=字典()
func removeName(){
//在这里使用单个图像引用,这样谷歌地图就不会崩溃
如果let image=avatarDic[avatarBase]{
self.icon=图像
}
否则{
avatarDic[avatarBase]=UIImage(名称:avatarBase)
self.icon=avatarDic[avatarBase]
}
}
func addName(){
self.icon=//在基础图像上绘制名称
}
//GMSMapView
var userIcons:[String:MyMarker]=字典()
var iconWithNames:Set=Set()
func地图视图(地图视图:GMSMapView!,DIDCHANGECOMERAPPOSITION位置:GMSCameraPosition!){
//查找可见化身直到限制
设bottomLeft=self.mapView.projection.visibleRegion().nearLeft
设topRight=self.mapView.projection.visibleRegion().farRight
var visibleMarkerSet:Set=Set()
用于self.userIcons中的(键、标记){
if(marker.position.latitude>bottomLeft.latitude&&marker.position.latitudebottomLeft.longitude&&marker.position.longitude{
visibleMarkerSet.insert(标记器)
}
//如果>50,则不显示
如果(visibleMarkerSet.count>50){
visibleMarkerSet=Set()
打破
}
}
//除名
对于self.iconWithNames中的markerWithName{
if(visibleMarkerSet.contains(markerWithName)==false){
markerWithName.removeName()标记
}
}
//添加名称
对于visibleMarkerSet中的visibleMarker{
visibleMarker.addName()
}
self.iconWithNames=visibleMarkerSet
}
设置标记的图标而不是设置标记的图标视图。这也会在for循环之外初始化映像,如下所示
func displayMarkers() {
let iconImage = UIImage(named: "locationgreen")
for partner in partners {
let lat : Double = Double(partner.location?.coordinates![1] ?? 0)
let lng : Double = Double(partner.location?.coordinates![0] ?? 0)
let position = CLLocationCoordinate2D(latitude: lat, longitude: lng)
let marker = GMSMarker(position: position)
marker.title = partner.name
marker.icon = iconImage
}
}@LoVo在那里使用单个图像是一个可用的选项,因为所有图像都有相同的标记,但在我的情况下,我的标记有不同的内容、地名和位置图像。请尝试使用视口偏移进行标记渲染。这里有一个GitHub lib,它可以为iOS实现(+集群以获得更好的性能)。如果它适用于您的用例,否则您可以采用实现逻辑并自己编写代码。可能相关的GoogleMapsAPI错误报告:我也面临同样的问题。仍在试图找出解决方案。这似乎是GMaps的错误。然而,正如有人提到的,您应该使用集群。你应该发送你的位置和半径,你的服务器应该返回集群。然后在适当的zoom服务器上发送一些集群和一些位置,然后只发送一些位置。这样,JSON/XML就不那么大了,用户可以在地图上看到一些东西,因为ATM真是一团糟。我想在图像中间有一个文本,如果我使用“代码>标记”图标<代码>代码,我该怎么做呢?