Search code examples
iosswiftmapkitannotation

How to do custom annotation view not find button click event?


I will try to find out of button click event in custom annotation view.How do it This.In In this not find out of button click event. Give some hint please.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

        let overlays = self.mapVW.overlays
        self.mapVW.removeOverlays(overlays)

        if view.annotation is MKUserLocation
        {
            // Don't proceed with custom callout
            return
        }

        let customeView = view.annotation as! Artwork
        let viewCustome = Bundle.main.loadNibNamed("mapPopUp", owner: nil, options: nil)

        let callOutView = viewCustome![0] as! CustomCalloutView
        callOutView.lblLocationName.text = customeView.title
        callOutView.lblCategory.text = customeView.category
        callOutView.lblDistance.text = customeView.distance

        let button = UIButton(frame: callOutView.lblLocationName.frame)
        button.addTarget(self, action: #selector(GayGuideViewController.btnRouteView(sender:)), for: .touchUpInside)
        callOutView.addSubview(button)

        callOutView.center = CGPoint(x: view.bounds.size.width / 5, y: -callOutView.bounds.size.height*0.52)
        view.addSubview(callOutView)
        mapVW.setCenter((view.annotation?.coordinate)!, animated: true)
    }

Thanks in advance.


Solution

  • I had using hitTest method for click event in custom pop up view. I had find hit point that time add notification observer and perform my action event.

        class CAnnotationView: MKAnnotationView
            {
                override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
                    let hitView = super.hitTest(point, with: event)
                    if (hitView != nil)
                    {
                        self.superview?.bringSubview(toFront: self)
                    }
                    return hitView
                }
                override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
                    let rect = self.bounds
                    var isInside: Bool = rect.contains(point)
                    if(!isInside)
                    {
                        for view in self.subviews
                        {
                            isInside = view.frame.contains(point)
                            if isInside
                            {
                                let dictionary = NSMutableDictionary()
                                dictionary.setValue(self.annotation?.coordinate.latitude, forKey: "lat")
                                dictionary.setValue(self.annotation?.coordinate.longitude, forKey: "long")
    
                                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Noti_Coordinate"), object: nil, userInfo: dictionary as? [AnyHashable : Any])
                                break
                            }
                        }
                    }
                    return isInside
                }
            }
    
    
    override func viewDidLoad() 
       {
                     NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "Noti_Coordinate"), object: nil)
                NotificationCenter.default.addObserver(self, selector: #selector(notificationForRoute(noti:)), name: NSNotification.Name(rawValue: "Noti_Coordinate"), object: nil)
        }
    func notificationForRoute(noti : NSNotification)
        {
            let dict = noti.userInfo! as NSDictionary
            let lat = dict.value(forKey: "lat")
            let long = dict.value(forKey: "long")
    
            let coordinate = CLLocationCoordinate2D(latitude: lat as! CLLocationDegrees, longitude: long as! CLLocationDegrees)
    
            let overlays = self.mapVW.overlays
            self.mapVW.removeOverlays(overlays)
    
            route(dest: coordinate )
        }