【问题标题】:Mkmapview annotations appear only after panning twiceMkmapview 注解仅在平移两次后出现
【发布时间】:2017-06-11 11:01:40
【问题描述】:

我在平移或缩放到新区域时无法显示注释。如果我平移到一个新的地图区域,什么都不会出现,但如果我在那里做一个小平移,就会出现注释。我希望无需用户多次平移即可显示注释。

我能找到的类似问题似乎已经通过在主线程上加载注释来解决,但到目前为止,我可能不明智地在主线程上运行所有内容。

我在我的 mapView 和 annotate 函数中添加了我的 regionDidChange 和 regionWillChange 函数。

  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)

    }
}

谢谢!

【问题讨论】:

    标签: ios swift annotations mkmapview


    【解决方案1】:

    一个非常简单的解决方法,但我花了很长时间才弄清楚。我不知道它背后的原因,但似乎我的注释数组始终来自最后一个 mapView rect。我将注释函数移到了我的天气数据 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()
    }
    

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

    【讨论】:

      猜你喜欢
      • 2022-12-16
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多