MapBox iOS 不同的标记图像?

MapBox iOS different marker images?

有没有办法添加 ID 或其他东西,我可以设置自定义标记图像?

我有多个带数字的标记,我需要每个新标记都有另一个图像。

例如:

标记 1 - marker_1_image

标记 2 - marker_2_image

Atm 我只能为所有标记设置 1 个图像(全局):

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
}

有什么想法吗?或者我可以子类化 MGLAnnotation 并将其用于所有委托方法吗?

您可以子类化并添加 userInfo 属性 (),或者您可以使用现有的 title/subtitle 属性:

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)!
}

您希望使图像加载更稳健并自定义重用标识符字符串的特异性,但这通常应该可行。

开始,推荐的方法是简单地创建您自己的注释 class,其中包含您需要的属性。

您应该实施 MGLAnnotation 协议或 subclass 并添加 userInfo 属性。 official example 中展示了这两种技术,这里是前者:

定义您的自定义注释class:

// 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
    }
}

并在您的视图控制器中使用它:

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:imageFor:` delegate method.
    point.reuseIdentifier = "someIdentiferForYourImage"
    point.image = UIImage(named: "someImage")

    mapView.addAnnotation(point)
}

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

        if let annotationImage = dequeueReusableAnnotationImage(withIdentifier: 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
}
// 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
}