Swift 2.0最佳方法的自定义详图索引视图



我想从xib创建一个自定义CalloutView。我创建了一个xib和自定义AnnotationView类。我想使用我的MapViewController segue,其名称为showDetail segue,因为此segue是Pushsegue。当用户点击我的calloutView中的按钮时,它应该执行我的showDetail分段。

我搜索了所有文档、教程、指南和问题,但我可以使用Swift找不到任何解决方案。也没有自定义库。我已经三天找不到任何解决方案了。

我的CalloutView.xib文件View是我的CustomAnnotationView,名称为CalloutAnnotationView.swift文件的所有者MapViewController,它允许我使用MapViewController段。

有我的CalloutAnnotationView.swift

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, withEvent: event)
        if (hitView != nil) {
            self.superview?.bringSubviewToFront(self)
        }
        return hitView
    }
    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
        let rect = self.bounds
        var isInside = CGRectContainsPoint(rect, point)
        if (!isInside) {
            for view in self.subviews {
                isInside = CGRectContainsPoint(view.frame, point)
                if (isInside) {
                }
            }
        }
        return isInside
    }
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        let calloutViewController = MapViewController(nibName: "CalloutView", bundle: nil)
        if selected {
            calloutViewController.view.clipsToBounds = true
            calloutViewController.view.layer.cornerRadius = 10
            calloutViewController.view.center = CGPointMake(self.bounds.size.width * 0.5, -calloutViewController.view.bounds.size.height * 0.5)
            self.addSubview(calloutViewController.view)

        } else {
            // Dismiss View
            calloutViewController.view.removeFromSuperview()
        }
    }

我的MapViewController.swift代码;

// MARK: - MapKit Delegate Methods
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
        if let annotation = annotation as? Veterinary { // Checking annotations is not User Location.
            var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(Constants.MapViewAnnotationViewReuseIdentifier) as? CalloutAnnotationView
            if pinView == nil { // If it is nil it created new Pin View
                pinView = CalloutAnnotationView(annotation: annotation, reuseIdentifier: Constants.MapViewAnnotationViewReuseIdentifier)
                pinView?.canShowCallout = false
            } else { pinView?.annotation = annotation } // If it is NOT nil it uses old annotations.
            // Checking pin colors from Veterinary Class PinColor Method
            pinView?.image = annotation.pinColors()
            //pinView?.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure)
            return pinView
        }
        return nil
    }

这些代码可以很好地加载我的xib文件。我从按钮创建了IBAction,它使用showDetail分段执行从MapViewController到我的DetailViewController分段但问题是它没有从superview中删除我的customCalloutView,所以我不能取消调用视图。

我该如何解决这个问题,或者创建自定义calloutView以使用我的MapViewController推送分段的最佳方法是什么?

非常感谢

在您的MKMapView代理中,查看在分割时是否调用了该代理

func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
   if let annotation = view.annotation as? Veterinary {
        mapView.removeAnnotation(annotation)
    }
}

我希望这能帮助您解决问题

func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
    if view.isKindOfClass(AnnotationView)
    {
        for subview in view.subviews
        {
            subview.removeFromSuperview()
        }
    }
}

最新更新