MapBox iOS不同的标记图像?

MapBox iOS不同的标记图像?,ios,mapbox,Ios,Mapbox,是否有一种方法可以添加一个ID或其他东西,我可以设置自定义标记图像 我有多个带有数字的标记,我需要每个新标记都有另一个图像 例如: marker1-marker_1_图像 marker2-marker_2_图像 Atm我只能为所有标记设置1个图像(全局): func mapView(mapView: MGLMapView, imageForAnnotation annotation: MGLAnnotation) -> MGLAnnotationImage? { var anno

是否有一种方法可以添加一个ID或其他东西,我可以设置自定义标记图像

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

例如:

marker1-marker_1_图像

marker2-marker_2_图像

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
property(),或者您可以使用现有的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)!
}
您可能希望使图像加载更加健壮,并自定义重用标识符字符串的特定性,但这通常会起作用。

继续,建议的方法是创建自己的注释类,其中包含所需的属性

您应该实现
MGLAnnotation
协议或子类,并添加
userInfo
属性。这两种技术都在中进行了演示,以下是前者:

定义自定义注释类:

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

谢谢-使用自定义属性子类化可能是最好的方法。我不想查看标题或副标题。嗨,谢谢你的例子。你有Objective-C中的代码吗?我无法同时添加两个自定义图像标记。经过深思熟虑的解决方案。谢谢。这应该是内置的。我为Swift 5做了一些更新。
// 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
}