Swift 注释的不同图像 [英] Swift different images for Annotation

查看:28
本文介绍了Swift 注释的不同图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设法在 Swift 中获得了注释图钉的自定义图标,但现在我仍然无法使用 2 个不同的图像来进行不同的注释.现在,一个按钮会向地图添加注释.应该还有另一个按钮也添加了注释,但带有另一个图标.

I managed to get a custom icon for a annotation pin in Swift, but now I am still stuck using 2 different images for different annotations. Right now a button adds a annotation to the map. There should be another button that also adds a annotation but with another icon.

有没有办法为此使用reuseId?

Is there a way to use the reuseId for this?

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> 正在调用该方法.

In the viewForAnnotation delegate method, set the image based on which annotation the method is being called for.

确保在视图出列或创建之后执行此操作(并且不仅在 if anView == nil 部分).否则,使用出列视图的注释将显示之前使用该视图的注释的图像.

Be sure to do this after the view is dequeued or created (and not only in the if anView == nil part). Otherwise, annotations that use a dequeued view will show the image of the annotation that used the view previously.

使用基本的MKPointAnnotation,区分注释的一种粗略方法是通过它们的title,但这不是很灵活.

With the basic MKPointAnnotation, one crude way to tell annotations apart is by their title but that's not very flexible.

更好的方法是使用实​​现 MKAnnotation 协议的自定义注释类(一种简单的方法是将 MKAnnotation 子类化)并添加任何需要的属性帮助实现自定义逻辑.

A better approach is to use a custom annotation class that implements the MKAnnotation protocol (an easy way to do that is to subclass MKPointAnnotation) and add whatever properties are needed to help implement the custom logic.

在自定义类中,添加一个属性,比如imageName,您可以使用它来根据注释自定义图像.

In the custom class, add a property, say imageName, which you can use to customize the image based on the annotation.

这个例子是MKPointAnnotation的子类:

class CustomPointAnnotation: MKPointAnnotation {
    var imageName: String!
}

创建 CustomPointAnnotation 类型的注释并设置它们的 imageName:

Create annotations of type CustomPointAnnotation and set their 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:

In viewForAnnotation, use the imageName property to set the view's 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
}

这篇关于Swift 注释的不同图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆