MapBox iOS不同的标记图像?

时间:2016-03-20 15:01:14

标签: ios mapbox

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

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

例如:

marker1 - marker_1_image

marker2 - 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并将其用于所有委托方法吗?

3 个答案:

答案 0 :(得分:7)

您可以继承并添加userInfo属性(as in this answer),也可以使用现有的标题/副标题属性:

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

您需要使图像加载更加健壮,并自定义重用标识符字符串的特殊性,但这通常可以正常工作。

答案 1 :(得分:3)

my initial answer继续,建议的方法是创建自己的注释类,其中包含您需要的属性。

您应该实现MGLAnnotation协议或子类并添加userInfo属性。这两种技术都在official example中展示,这里是前者:

定义自定义注释类:

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

答案 2 :(得分:3)

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