我很难在MapView上选择自定义注释。我尝试了几种方法,但没有成功:

  • 使用MKMapViewDelegate的didSelect
  • 使用添加到AnnotationView的UIButton
  • 将UITapGestureRecognizer用于ImageView,应将其用于批注

  • 您可以在下面的代码中找到所有这些注释的方法:
    override func viewDidLoad() {
        super.viewDidLoad()
        // some more initialization code
    
        for item in items {
            let annotation = IdentifiedMKPointAnnotation() // has only one additional property named "id"
    
            annotation.coordinate = CLLocationCoordinate2D(latitude: item.spots[0].latitude!, longitude: item.spots[0].longitude!)
            annotation.id = i
    
            self.mapView.addAnnotation(annotation)
    
            i += 1
        }
    }
    
    
    // MARK: - MapViewDelegate
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let item = self.items[(annotation as! IdentifiedMKPointAnnotation).id!]
    
        let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "")
        //annotationView.canShowCallout = false
        //annotationView.isEnabled = false
    
        let imageView = UIImageView()
        imageView.frame.size = CGSize(width: 40, height: 40)
        imageView.layer.cornerRadius = 20
        imageView.layer.masksToBounds = true
        imageView.af_setImage(withURL: URL(string: item.images.count > 0 ? item.images[0] : item.image!)!)
        imageView.contentMode = .scaleAspectFill
    
        //let gr = UIGestureRecognizer(target: self, action: #selector(annotationSelected(_:)))
        //imageView.addGestureRecognizer(gr)
        //imageView.isUserInteractionEnabled = true
    
        //let button = UIButton()
        //button.frame.size = CGSize(width: 40, height: 40)
        //button.setImage(#imageLiteral(resourceName: "play_arrow"), for: .normal)
        //button.addTarget(self, action: #selector(annotationSelected(_:)), for: .touchUpInside)
    
        annotationView.addSubview(imageView)
        //annotationView.addSubview(button)
    
        return annotationView
    }
    
    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        performSegue(withIdentifier: "showDetail", sender: self.items[(view.annotation as! IdentifiedMKPointAnnotation).id!])
    
        view.setSelected(false, animated: false)
    }
    
    func annotationSelected(_ sender: UIImageView) {
        performSegue(withIdentifier: "showDetail", sender: self.items[((sender.superview as! MKAnnotationView).annotation as! IdentifiedMKPointAnnotation).id!])
    }
    

    有什么想法为什么不执行该动作?

    最佳答案

    如果注释的title为空,则不调用didSelect委托。请尝试以下代码。

    let annotation = IdentifiedMKPointAnnotation()
    annotation.title = "title"
    

    09-25 17:22