Swift的不同图像

时间:2014-09-02 20:00:35

标签: ios swift mkmapview mkannotationview mkpointannotation

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

有没有办法为此使用reuseId?

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
}

2 个答案:

答案 0 :(得分:81)

viewForAnnotation委托方法中,根据要调用的方法image设置annotation

在视图出列或创建后(确保<{1}}部分),确保执行此操作。否则,使用出列视图的注释将显示先前使用该视图的注释的图像。

使用基本的if anView == nil,一种粗略的方式来区分注解是MKPointAnnotation,但这不是很灵活。

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

在自定义类中,添加一个属性,例如MKPointAnnotation,您可以使用该属性根据注释自定义图像。

此示例子类imageName

MKPointAnnotation

创建class CustomPointAnnotation: MKPointAnnotation { var imageName: String! } 类型的注释并设置其CustomPointAnnotation

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

答案 1 :(得分:12)

iOS Swift Code在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!
}