我设法在Swift中为注解图钉获得了一个自定义图标,但是现在我仍然对2个不同的注解使用不同的图像。现在,一个按钮会在地图上添加注释。应该有另一个按钮,该按钮也添加了注释,但带有另一个图标。
有没有办法为此使用复用ID?
class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var Map: MKMapView! @IBAction func btpressed(sender: AnyObject) { var lat:CLLocationDegrees = 40.748708 var long:CLLocationDegrees = -73.985643 var latDelta:CLLocationDegrees = 0.01 var longDelta:CLLocationDegrees = 0.01 var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta) var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, long) var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span) Map.setRegion(region, animated: true) var information = MKPointAnnotation() information.coordinate = location information.title = "Test Title!" information.subtitle = "Subtitle" Map.addAnnotation(information) } func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if !(annotation is MKPointAnnotation) { return nil } let reuseId = "test" var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.image = UIImage(named:"1.png") anView.canShowCallout = true } else { anView.annotation = annotation } return anView }
在viewForAnnotation委托方法中,设置调用该方法所image基于的依据annotation。
viewForAnnotation
image
annotation
一定要做到这一点 后 视图被出队或创建的(而不是只在if anView == nil部分)。否则,使用出队视图的注释将显示以前使用该视图的注释的图像。
if anView == nil
使用basic MKPointAnnotation,区分注释的一种粗略方法是通过注释,title但这不是很灵活。
MKPointAnnotation
title
更好的方法是使用实现MKAnnotation协议的自定义注释类(一种简单的方法是子类化MKPointAnnotation),并添加所需的任何属性以帮助实现自定义逻辑。
MKAnnotation
在自定义类中,添加一个属性,例如imageName,您可以使用该属性基于注释自定义图像。
imageName
此示例子类MKPointAnnotation:
class CustomPointAnnotation: MKPointAnnotation { var imageName: String! }
创建类型的注释CustomPointAnnotation并设置其imageName:
CustomPointAnnotation
var info1 = CustomPointAnnotation() info1.coordinate = CLLocationCoordinate2DMake(42, -84) info1.title = "Info1" info1.subtitle = "Subtitle" info1.imageName = "1.png" var info2 = CustomPointAnnotation() info2.coordinate = CLLocationCoordinate2DMake(32, -95) info2.title = "Info2" info2.subtitle = "Subtitle" info2.imageName = "2.png"
在中viewForAnnotation,使用imageName属性设置视图的image:
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if !(annotation is CustomPointAnnotation) { return nil } let reuseId = "test" var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.canShowCallout = true } else { anView.annotation = annotation } //Set annotation-specific properties **AFTER** //the view is dequeued or created... let cpa = annotation as CustomPointAnnotation anView.image = UIImage(named:cpa.imageName) return anView }