2016-09-24 4 views
0

Je suis en train de faire une annotation qui sera redimensionnableRedimensionner MKAnnotationView avec MKZoomScale - Swift 2.0

J'ai une annotation personnalisée que j'ai créé

class MapAnnotation: NSObject, MKAnnotation { 
    var coordinate: CLLocationCoordinate2D 
    var image: UIImage? = UIImage(named: "image") 

    init(coordinate: CLLocationCoordinate2D) { 
     self.coordinate = coordinate 
    } 
} 

et annotationView qui comprend l'image.

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    if let annotation = annotation as? MapAnnotation { 
     var pin = mapView.dequeueReusableAnnotationViewWithIdentifier("myCustomAnnotation") 
     if pin == nil { 
      pin = MKAnnotationView(annotation: annotation, reuseIdentifier: "myCustomAnnotation") 
     } 
     pin!.image = annotation.image 
     return pin 
    } 
    return nil 
} 

Et lorsque je redimensionne le mapView, je veux que le MKAnnotationView soit également redimensionné.

Je sais que MKOverlayRenderer a la fonction drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext) qui inclut le paramètre zoomScale: MKZoomScale.

De plus, je vis cette solution:

let zoomScale: MKZoomScale = mapView.bounds.size.width/
     CGFloat(mapView.visibleMapRect.size.width) 

Mais je veux l'accès à la MKZoomScale dans la fonction drawMapRect et non la façon de personnaliser. Cela signifie que je dois faire un MKOverlayRenderer à la place de MKAnnotationView que je ne veux pas, parce que MKOverlay dessine sur la carte et que je veux faire une annotationView, qui n'est pas dessinée sur la carte. Après cela, je vais avoir le MKZoomScale Je veux redimensionner l'annotationViews entre MKZoomScale 1 à 0,25 et si le MKZoomScale est inférieur à 0,25 je veux que les annotationsViews disparaissent.

Merci de votre aide!

Répondre

0

Vous pouvez obtenir le montant de la durée « zoom » sur la région var du Mapview:

mapView.region.span 

Ensuite, dans votre fonction viewForAnnotation, vous pouvez faire quelques calculs à l'échelle de l'annotation, ou ont l'annotation faire une sorte de fonction sur elle-même pour afficher plus grand.

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
<pin init methods> 
let averageSpan = mapView.region.span.x * mapView.region.span.x * 0.5 
let pinScale = someFunctionToReturnScaleBasedOnAverageSpan(averageSpan) 
pin.scaleSelf(pinScale) 
return pin 

}

Je ne me souviens pas du haut de ma tête, mais si viewForAnnotation ne soit pas appelé lorsque la carte met à jour sa durée, vous devez une sorte de fonction de mise à jour qui supprime et ajoute des annotations.

Il serait cependant plus facile d'utiliser un MKOverlay.

+0

est juste que MKZoomScale dans la fonction 'drawMapRect (mapRect: MKMapRect, zoomScale: MKZoomScale, contexte inContext: CGContext)' vous donnant une zoomScale par défaut que je veux utiliser. Si je voulais utiliser MKCoordinateSpan, je l'utiliserais déjà. Vous pouvez essayer d'utiliser la fonction 'drawMapRect' et imprimer le' zoomScale', et par là vous pouvez voir de quoi je parle. – KillerDeveloper