2017-06-11 27 views
0

我在平移或缩放到新区域时出现注释时出现困难。如果我平移到新的地图区域,则不会显示任何内容,但如果我在那里做一个小平底锅,则会出现注释。我希望在不需要用户多次平移的情况下显示注释。Mkmapview注释仅在平移两次之后出现

我发现的类似问题似乎已经通过在主线程中加载注释来解决,但到目前为止,可能不太合适,我正在主线程上运行所有内容。

我已经包含了我的regionDidChange和regionWillChange函数,其中我注释了我的mapView和annotate函数。

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) { 
    zoomLevelBeforeChange = ((mapView.getZoomLevel() * 100).rounded()/100) 
} 

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 

    var apiScale: String 
    print("Zoom: \(mapView.getZoomLevel())") 

    if mapView.getZoomLevel() < 5 { 
     mapView.setCenter(coordinate: mapView.centerCoordinate, zoomLevel: 5, animated: true) 
     apiScale = "6" 
    } else if mapView.getZoomLevel() >= 5.0 && mapView.getZoomLevel() < 6.0 { 
     apiScale = "6" 
    } else if mapView.getZoomLevel() >= 6.0 && mapView.getZoomLevel() < 7.5 { 
     apiScale = "7" 
    } else if mapView.getZoomLevel() >= 7.5 && mapView.getZoomLevel() < 8.5 { 
     apiScale = "9" 
    } else if mapView.getZoomLevel() >= 8.5 && mapView.getZoomLevel() <= 9.5 { 
     apiScale = "11" 
    } else if mapView.getZoomLevel() >= 9.5 && mapView.getZoomLevel() <= 10.0 { 
     apiScale = "13" 
    } else if mapView.getZoomLevel() > 10 { 
     mapView.setCenter(coordinate: mapView.centerCoordinate, zoomLevel: 10, animated: true) 
     apiScale = "13" 
    } else { 
     apiScale = "0" 
    } 
    print(apiScale) 

    if ((mapView.getZoomLevel() * 100).rounded()/100) == zoomLevelBeforeChange { 
     print("don't remove annotations") 
    } else { 
     let allAnnotations = self.mapView.annotations 
     self.mapView.removeAnnotations(allAnnotations) 
    } 

    let latitudeDelta = mapView.region.span.latitudeDelta 
    let longitudeDelta = mapView.region.span.longitudeDelta 
    let centerCoordLat = mapView.centerCoordinate.latitude 
    let centerCoordLong = mapView.centerCoordinate.longitude 

    lowerLeftLong = (centerCoordLong - (longitudeDelta/2)) 
    lowerLeftLat = (centerCoordLat - (latitudeDelta/2)) 
    upperRightLong = (centerCoordLong + (longitudeDelta/2)) 
    upperRightLat = (centerCoordLat + (latitudeDelta/2)) 

    mapUrl = "http://api.openweathermap.org/data/2.5/box/city?bbox=\(lowerLeftLong!),\(lowerLeftLat!),\(upperRightLong!),\(upperRightLat!),\(apiScale)&appid=(appId)" 

    downloadMapWeatherApi { 
     annotate() 
     self.mapAnnotations = [] 
    } 
} 


func downloadMapWeatherApi(completed: DownloadComplete) { 
    Alamofire.request(self.mapUrl).responseJSON { response in 
     let result = response.result 
     if let dict = result.value as? Dictionary<String, AnyObject> { 
      if let list = dict["list"] as? [Dictionary<String, AnyObject>] { 

       for obj in list { 
        let annotation = MapAnnotation(locationDict: obj) 
        self.mapAnnotations.append(annotation) 
       } 
      } 
     } 
    } 
    completed() 
} 


func annotate() { 

    for location in self.mapAnnotations { 
     let annotation = CustomAnnotation() 
     annotation.title = location.cityName 
     annotation.subtitle = "\(Int(location.temperature))°" 
     annotation.attribute = location.weatherType 
     annotation.coordinate = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude) 
     mapView.addAnnotation(annotation) 

    } 
} 

谢谢!

回答

0

一个非常简单的修复,但花了很长时间才弄清楚。我不知道它背后的原因,但看起来我的注释数组始终来自最后的mapView矩形。我将我的注释功能移到了我的天气数据API调用中,并纠正了它。

func downloadMapWeatherApi(completed: DownloadComplete) { 
    Alamofire.request(self.mapUrl).responseJSON { response in 
     let result = response.result 
     if let dict = result.value as? Dictionary<String, AnyObject> { 
      if let list = dict["list"] as? [Dictionary<String, AnyObject>] { 

       for obj in list { 
        let annotation = MapAnnotation(locationDict: obj) 
        self.mapAnnotations.append(annotation) 
       } 
       self.annotate() 
      } 
     } 
    } 
    completed() 
} 

希望这可以帮助有类似问题的人。