未调用MKMapView MKPointAnnotation tap事件

时间:2015-02-23 08:20:34

标签: ios swift mkmapview mkannotationview mkpointannotation

我正在使用带有MKPointAnnotation的MKMapView(正确设置委托)。注释是在后台线程上调用的此方法中生成的。

func updateMapAnnotations() {
    for var i = 0; i < DataManager.getStationList().count; i++ {
        var s = DataManager.getStationList()[i] as Station
        var annotation = MKPointAnnotation()
        annotation.setCoordinate(CLLocationCoordinate2D(latitude: s.latitude, longitude: s.longitude))
        annotation.title = "\(s.id)"
        dispatch_async(dispatch_get_main_queue(), {
            self.mapView.addAnnotation(annotation)
        })
    }
}

annotationViews在这里生成:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    if (annotation is MKUserLocation) {
        return nil
    }

    let reuseId = "StationAnnotation"

    let annoStation = DataManager.getStationById(annotation.title!.toInt()!)

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil {

        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        let base = UIView(frame: CGRect(x: 0, y: 0, width: 67, height: 26))

        let imageView = UIImageView(frame: CGRect(x: 2, y: 2, width: 22, height: 22))
        imageView.image = UIImage(named: "test")

        base.layer.cornerRadius = 3.0
        base.clipsToBounds = true
        base.backgroundColor = UIColor.whiteColor()

        var priceLabelBig = UILabel(frame: CGRect(x: 25, y: 0, width: 30, height: 25))
        priceLabelBig.textColor = UIColor.blackColor()
        priceLabelBig.font = UIFont(name: priceLabelBig.font.fontName, size: 15)

        var priceLabelSmall = UILabel(frame: CGRect(x: 55, y: 0, width: 12, height: 15))
        priceLabelSmall.textColor = UIColor.blackColor()
        priceLabelSmall.font = UIFont(name: priceLabelBig.font.fontName, size: 12)

        if let curPrice = annoStation?.getTextWithSettings().description {
        var stringLength = countElements(curPrice)
        var substringToIndex = stringLength - 1
            priceLabelBig.text = curPrice.substringToIndex(advance(curPrice.startIndex, substringToIndex))
            priceLabelSmall.text = curPrice.substringFromIndex(advance(curPrice.startIndex, substringToIndex))
        }

        base.addSubview(imageView)
        base.addSubview(priceLabelBig)
        base.addSubview(priceLabelSmall)

        anView.addSubview(base)
        anView.canShowCallout = true
    }
    else {
        anView.annotation = annotation
    }

    return anView
}

我知道我必须设置注释标题并设置&#39; canShowCallOut&#39;为了得到'didSelectAnnotationView&#39;工作。如您所见,两者都设置正确。

所以我拥有的是mapView(委托已设置),&#39; canShowCallOut&#39;是真的,标题设置和工作。

要进入详情页面,我想跟踪anotationViews上的点击(&#39; didSelectAnnotationView&#39;),但不会调用它。

我做错了什么?

1 个答案:

答案 0 :(得分:6)

好的,我自己找到了解决方案。

您必须明确设置annotationViews框架。如果只为视图设置子视图,则会显示它们,但视图框设置为0,0(高度,重量)。因此你无法点击它,因为该区域也是0,0。

我的解决方案是这个,有趣的一行是annotationView.frame = CGRect(x: 0, y: 0, width: 67, height: 26)。其他一切都是一样的。现在,点击注释会调用didSelectAnnotationView

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    if (annotation is MKUserLocation) {
        return nil
    }

    let reuseId = "stationAnnotation"

    let annoStation = DataManager.getStationById(annotation.title!.toInt()!)

    var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if annotationView == nil {

        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        annotationView.frame = CGRect(x: 0, y: 0, width: 67, height: 26)
        let base = UIView(frame: CGRect(x: 0, y: 0, width: 67, height: 26))
        base.userInteractionEnabled = true

        let imageView = UIImageView(frame: CGRect(x: 2, y: 2, width: 22, height: 22))
        imageView.image = UIImage(named: "zapfsaeule")

        base.layer.cornerRadius = 3.0
        base.clipsToBounds = true
        base.backgroundColor = UIColor.whiteColor()

        var priceLabelBig = UILabel(frame: CGRect(x: 25, y: 0, width: 30, height: 25))
        priceLabelBig.textColor = UIColor.blackColor()
        priceLabelBig.font = UIFont(name: priceLabelBig.font.fontName, size: 15)

        var priceLabelSmall = UILabel(frame: CGRect(x: 55, y: 0, width: 12, height: 15))
        priceLabelSmall.textColor = UIColor.blackColor()
        priceLabelSmall.font = UIFont(name: priceLabelBig.font.fontName, size: 12)

        if let curPrice = annoStation?.getPriceWithSettings().description {
            var stringLength = countElements(curPrice)
            var substringToIndex = stringLength - 1
            priceLabelBig.text = curPrice.substringToIndex(advance(curPrice.startIndex, substringToIndex))
            priceLabelSmall.text = curPrice.substringFromIndex(advance(curPrice.startIndex, substringToIndex))
        }

        base.addSubview(imageView)
        base.addSubview(priceLabelBig)
        base.addSubview(priceLabelSmall)

        annotationView.addSubview(base)
        annotationView.annotation = annotation
    }
    else {
        annotationView.annotation = annotation
    }

    return annotationView
}