迅速不同的图像注释
我设法在Swift中获得了一个注释引脚的自定义图标,但是现在我仍然使用2个不同的图像来注释不同的注释。 现在一个button添加一个注释到地图。 应该有另一个button,也添加注释,但与另一个图标。
有没有办法使用这个重用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
委托方法中,根据要调用哪个annotation
设置image
。
一定要在视图出列或创build后(而不是只在if anView == nil
零部件中)执行此操作。 否则,使用出队视图的注释将显示之前使用视图的注释的图像。
使用基本的MKPointAnnotation
,分离注释的一种粗糙的方法是title
但这不是很灵活。
更好的方法是使用实现MKAnnotation
协议的自定义注释类(一种简单的方法来实现MKPointAnnotation
子类),并添加需要的任何属性来帮助实现自定义逻辑。
在自定义类中,添加一个属性,例如imageName
,您可以使用该属性来基于注释自定义图像。
这个例子的子类MKPointAnnotation
:
class CustomPointAnnotation: MKPointAnnotation { var imageName: String! }
创buildtypesCustomPointAnnotation
注释并设置它们的imageName
:
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 }
iOS的Swift代码在Anna和Fabian Boulegue的帮助下:
import UIKit import MapKit class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() self.mapView.delegate = self var info1 = CustomPointAnnotation() info1.coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) info1.title = "Info1" info1.subtitle = "Subtitle" info1.imageName = "flag.png" var info2 = CustomPointAnnotation() info2.coordinate = CLLocationCoordinate2DMake(26.862280, 75.815098) info2.title = "Info2" info2.subtitle = "Subtitle" info2.imageName = "flag.png" mapView.addAnnotation(info1) mapView.addAnnotation(info2) } func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { println("delegate called") 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 } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } class CustomPointAnnotation: MKPointAnnotation { var imageName: String! }
- 如何正确使用“openParentApplication”和“handleWatchKitExtensionRequest”以便“reply()”被调用?
- 如何在iOS App中支持Universal Links并为其设置服务器?
- 如何在iOS App Store中实时检索前1000个游戏列表
- cordova – 我可以上传国际音标来testing飞行出sdk?
- 无法从iOS中的Google云端硬盘中获取文件
- 将NSString转换为date
- 在Swift中,fileExistsAtPath(_ path:String,isDirectory isDirectory:UnsafeMutablePointer ) – > Bool仅接受单个参数
- 核心数据ios9:多字段唯一约束
- iOS后台应用程序networking访问
- 如何在Swift 3中使用带Proxy的URLSession
- 无声的通知callback方法,只有当应用程序在后台调用