MapKit отображает кластеры аннотаций и вместе с некластеризованными аннотациями

Я новичок в разработке iOS и в настоящее время использую FBAnnotationClusteringSwift для создания кластеров. Мое приложение должно иметь две аннотации, которые не будут кластеризованы, поскольку они указывают адреса source и destination. Остальные аннотации должны быть сгруппированы, поскольку они представляют stations.

То, чего я хочу добиться, похоже на изображение ниже, где "A" – мой исходный адрес, а кластеры представляют станции:

Это моя цель

Однако происходит следующее: по мере создания кластеров аннотация, представляющая некластеризованную аннотацию (адрес источника), исчезает следующим образом:

Настоящий

Если библиотека смешивает все аннотации вместе, это довольно плохо, должен быть способ отделить те, которые я добавил через clusteredAnnotationsWithinMapRect (станции), и те маркеры, которые уже были добавлены ранее (адреса). Вот соответствующая часть текущего кода:

var markerClusterer: FBClusteringManager?

ViewController ... {

  override func viewDidLoad() {
    super.viewDidLoad()
    ...
    self.markerClusterer = FBClusteringManager()
    self.markerClusterer!.delegate = self
  }

  func cellSizeFactorForCoordinator(coordinator:FBClusteringManager) -> CGFloat{
    return 1.0
  }

  func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
      // Here is just like the example code from FBAnnotationClusterSwift
      var stations: [MKAnnotation] = fetchStations(...)
      if (stations.count > 0) {
          NSOperationQueue().addOperationWithBlock({
              let scale:Double = Double(self.mapView.bounds.size.width) / self.mapView.visibleMapRect.size.width
              self.markerClusterer!.addAnnotations(stations)
              var annotationArray = stations
              // Needed to do that otherwise the clusters never "explode" into pins
              if (scale <= 0.06) {
                  annotationArray = self.markerClusterer!.clusteredAnnotationsWithinMapRect(self.mapView.visibleMapRect, withZoomScale:scale)
              }
              self.markerClusterer!.displayAnnotations(annotationArray, onMapView: self.mapView)
            })
        }              
    }

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

        var reuseId = ""

        if (annotation.isKindOfClass(FBAnnotationCluster)) {
            reuseId = "Cluster"
            var clusterView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
            if clusterView == nil {
                clusterView = FBAnnotationClusterView(annotation: annotation, reuseIdentifier: reuseId, options: nil)
            } else {
                clusterView!.annotation = annotation
            }
            return clusterView
        } else if (annotation.isKindOfClass(AddressPointAnnotation)) {
            reuseId = "AddressPin"
            var addressPinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
            if addressPinView == nil {
                addressPinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
                addressPinView!.canShowCallout = true
            }
            else {
                addressPinView!.annotation = annotation
            }
            let addressPin = annotation as! AddressPointAnnotation
            addressPinView!.image = UIImage(named: addressPin.icon)
            return addressPinView
        } else if (annotation is Station) {
            reuseId = "StationPin"
            var stationPinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
            if stationPinView == nil {
                stationPinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            }
            else {
                stationPinView!.annotation = annotation
            }
            let stationPin = annotation as! Station
            stationPinView!.image = UIImage(named: "station")
            return stationPinView
        } else {
            return nil
        }
    }

}

// Annotation for the stations
class Station: NSObject, MKAnnotation {
   var id: Int = 0
   var availableBikes: Int = 0
   var availableBikeStands: Int = 0
   var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 39.208407, longitude: -76.799555)
}

// Annotations for addresses
class AddressPointAnnotation: MKPointAnnotation {
  var icon: String!
}

class Address: NSObject {

    var marker: AddressPointAnnotation?

    func addMarker(coordinate: CLLocationCoordinate2D) {
        marker = AddressPointAnnotation()
        marker!.coordinate = coordinate
        // ViewController is passed to the Address, so it can add itself to the map
        self.controller.mapView.addAnnotation(marker!)
        if (self.direction == SOURCE) {
            marker!.title = "Starting address"
            marker!.icon = "from"
        } else {
            marker!.title = "Destination address"
            marker!.icon = "to"
        }
        self.controller.mapView.addAnnotation(marker!)
    }
}

Любая помощь, идея или комментарий более чем приветствуются. Спасибо.


person Eduardo    schedule 10.06.2016    source источник