Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义标记器性能iOS,崩溃,结果为“;((null))为false:已达到纹理地图集的最大数量,无法分配更多。”;_Ios_Objective C_Google Maps_Uiimage_Google Maps Markers - Fatal编程技术网

自定义标记器性能iOS,崩溃,结果为“;((null))为false:已达到纹理地图集的最大数量,无法分配更多。”;

自定义标记器性能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

我已经在我的应用程序中集成了谷歌地图,还使用了谷歌地图API。在我从GooglePlacesAPI(大约60个)获得所有结果之后,我将在自定义标记的帮助下显示它们。我正在制作的自定义标记由“地点图像”和“地点名称”组成,因此我必须首先在UIView中绘制它,然后借助以下函数将其呈现为UIImage

- (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真是一团糟。我想在图像中间有一个文本,如果我使用“代码>标记”图标<代码>代码,我该怎么做呢?