没有调用MKMapView 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) }) } } 

注解视图在这里生成:

 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 } 

我知道我必须设置注释标题,并将“canShowCallOut”设置为true以获得“didSelectAnnotationView”的工作。 正如你所看到的,两者都设置正确。

所以我有一个mapView(委托设置),“canShowCallOut”是真实的,一个标题设置和工作。

要进入详细信息页面,我想跟踪annotationViews('didSelectAnnotationView')上的点击,但不会调用它。

我究竟做错了什么?

好吧,我自己find了解决scheme。

您必须显式设置annotationViews框架。 如果您只是为视图设置子视图,它们将显示,但视图框架设置为0,0(高度,重量)。 所以你只是不能点击它,因为面积是0,0。

我的解决scheme是这样的,有趣的线是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 }