2016-03-20 20 views
3

Özel işaretleyici görüntüleri ayarlayabildiğim bir kimlik veya bir şey eklemenin bir yolu var mı?MapBox iOS farklı işaretleyici resimleri?

Sayılarla birden fazla işaretçim var ve her yeni işaretleyicinin başka bir görüntüye sahip olmasına ihtiyacım var. Örneğin

:

marker1 - marker_1_image

marker2 - marker_2_image

Atm i tüm belirteçler için 1 resim (globaly) ayarlamak için sadece am güçlü:

func mapView(mapView: MGLMapView, imageForAnnotation annotation: MGLAnnotation) -> MGLAnnotationImage? { 

    var annotationImage = mapView.dequeueReusableAnnotationImageWithIdentifier("place") 

    if annotationImage == nil { 
     var image = UIImage(named: "marker_1")! 
     image = image.imageWithAlignmentRectInsets(UIEdgeInsetsMake(0, 0, image.size.height/2, 0)) 
     annotationImage = MGLAnnotationImage(image: image, reuseIdentifier: "place") 
    } 

    return annotationImage 
} 

Herhangi bir fikir ? Veya MGLAnnotation alt sınıfını kullanabilir ve bunu tüm delege yöntemleri için kullanabilir miyim?

cevap

6

Sen alt sınıfı ve (as in this answer) bir userInfo özelliği ekleyebilir veya varolan başlık/altyazı özelliklerini kullanabilirsiniz olabilir: Görüntü yükleme daha sağlam olmak istersiniz

func mapView(mapView: MGLMapView, imageForAnnotation annotation: MGLAnnotation) -> MGLAnnotationImage? { 
    // get the custom reuse identifier for this annotation 
    let reuseIdentifier = reuseIdentifierForAnnotation(annotation) 
    // try to reuse an existing annotation image, if it exists 
    var annotationImage = mapView.dequeueReusableAnnotationImageWithIdentifier(reuseIdentifier) 

    // if the annotation image hasn‘t been used yet, initialize it here with the reuse identifier 
    if annotationImage == nil { 
     // lookup the image for this annotation 
     let image = imageForAnnotation(annotation) 
     annotationImage = MGLAnnotationImage(image: image, reuseIdentifier: reuseIdentifier) 
    } 

    return annotationImage 
} 

// create a reuse identifier string by concatenating the annotation coordinate, title, subtitle 
func reuseIdentifierForAnnotation(annotation: MGLAnnotation) -> String { 
    var reuseIdentifier = "\(annotation.coordinate.latitude),\(annotation.coordinate.longitude)" 
    if let title = annotation.title where title != nil { 
     reuseIdentifier += title! 
    } 
    if let subtitle = annotation.subtitle where subtitle != nil { 
     reuseIdentifier += subtitle! 
    } 
    return reuseIdentifier 
} 

// lookup the image to load by switching on the annotation's title string 
func imageForAnnotation(annotation: MGLAnnotation) -> UIImage { 
    var imageName = "" 
    if let title = annotation.title where title != nil { 
     switch title! { 
     case "blah": 
      imageName = "blahImage" 
     default: 
      imageName = "defaultImage" 
     } 
    } 
    // ... etc. 
    return UIImage(named: imageName)! 
} 

ve özgünlüğünü özelleştirmek yeniden tanımlayıcı dizesi, ancak bu genellikle çalışır.

+0

Teşekkürler - Subclassing Özel mülk ile burada en iyi yolu olabilir. Başlığı veya altyazıyı kontrol etmek istemiyorum. – derdida

+0

Merhaba, örnek için teşekkürler. Kodu Objective-C'de var mı? Aynı anda iki özel resim işaretçisi ekleyemiyorum. – Apple

+0

İyi düşünülmüş çözüm. –

3

my initial answer'dan devam etmek için, bunu yapmanın önerilen yolu, ihtiyacınız olan özellikleri içeren kendi notlandırma sınıfınızı oluşturmaktır.

MGLAnnotation protokolünü veya alt sınıfı uygulamalı ve userInfo özelliğini eklemelisiniz. Her iki teknik official example gösterildiği ve burada eski olduğunu gibidir:

özel açıklama sınıf tanımlayın:

// MGLAnnotation protocol reimplementation 
class CustomPointAnnotation : NSObject, MGLAnnotation { 
    // As a reimplementation of the MGLAnnotation protocol, we have to add mutable coordinate and (sub)title properties ourselves. 
    var coordinate: CLLocationCoordinate2D 
    var title: String? 
    var subtitle: String? 

    // Custom properties that we will use to customize the annotation's image. 
    var image: UIImage? 
    var reuseIdentifier: String? 

    init(coordinate: CLLocationCoordinate2D, title: String?, subtitle: String?) { 
     self.coordinate = coordinate 
     self.title = title 
     self.subtitle = subtitle 
    } 
} 

Ve görünümü denetleyicisi kullanmak:

override func viewDidLoad() { 
    // Do your map loading, remembering to set the map delegate. 

    let point = CustomPointAnnotation(coordinate: CLLocationCoordinate2DMake(0, 0), 
     title: "Custom Point Annotation", 
     subtitle: nil) 
    // Set the custom `image` and `reuseIdentifier` properties, later used in the `mapView:imageForAnnotation:` delegate method. 
    point.reuseIdentifier = "someIdentiferForYourImage" 
    point.image = UIImage(named: "someImage") 

    mapView.addAnnotation(point) 
} 

func mapView(mapView: MGLMapView, imageForAnnotation annotation: MGLAnnotation) -> MGLAnnotationImage? { 
    if let point = annotation as? CustomPointAnnotation, 
     image = point.image, 
     reuseIdentifier = point.reuseIdentifier { 

     if let annotationImage = mapView.dequeueReusableAnnotationImageWithIdentifier(reuseIdentifier) { 
      // The annotatation image has already been cached, just reuse it. 
      return annotationImage 
     } else { 
      // Create a new annotation image. 
      return MGLAnnotationImage(image: image, reuseIdentifier: reuseIdentifier) 
     } 
    } 

    // Fallback to the default marker image. 
    return nil 
} 
0
// set different images for multiple pins. 


func mapView(mapView: MGLMapView, imageForAnnotation annotation: MGLAnnotation) -> MGLAnnotationImage? 
{ 
    var annotationImage : MGLAnnotationImage? = nil 


    //seems to be a double optional! String?? 

    var title = "" 
    var subTitle = "" 
    //-------------------------------------------------- 
    //TITLE 
    //-------------------------------------------------- 

    if let titleOpt = annotation.title{ 
     if let title_ = titleOpt{ 
      title = title_ 

     } 
    } 

    //-------------------------------------------------- 
    //SUBTITLE 
    //-------------------------------------------------- 
    if let subtitleOpt = annotation.subtitle{ 
     if let subtitle_ = subtitleOpt{ 
      subTitle = subtitle_ 

     } 
    } 
    //--------------------------------------------------------------------- 
    if title == "" { 

    }else{ 

     if title == "Assault" { 
      // let imageOut = (title , iconColor: UIColor.appColorFlat_TahitiGold_Orange()) 
      annotationImage = MGLAnnotationImage(image:UIImage(named:"Assault")!, reuseIdentifier: title) 
     } 
     else if title == "Rape" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Rape")!, reuseIdentifier: title) 
     } 
     else if title == "Robbery" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Robbery")!, reuseIdentifier: title) 
     } 
     else if title == "Violet Crime Murder" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Violet Crime Murder")!, reuseIdentifier: title) 
     } 
     else if title == "Poor Roads" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Poor Roads")!, reuseIdentifier: title) 
     } 
     else if title == "Unsafe Neighbourhoods" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Unsafe Neighbourhoods")!, reuseIdentifier: title) 
     } 
     else if title == "Arson" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Arson")!, reuseIdentifier: title) 
     } 

     else if title == "Poor Lighting" { 
      //let imageOut = self.textToImage(title , iconColor: UIColor.appColorButtonPink()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Poor Lighting")!, reuseIdentifier: title) 
     } 
     else{ 

      // let imageOut = self.textToImage(title ,iconColor: UIColor.appColorCYAN()) 
      annotationImage = MGLAnnotationImage(image: UIImage(named:"Default")!, reuseIdentifier: title) 
     } 
    } 
    return annotationImage 
} 
İlgili konular