有没有办法添加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并将其用于所有委托方法吗?
答案 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
}