Mapbox委托calloutViewTapped不起作用

时间:2019-06-21 12:25:45

标签: ios swift mapbox

我使用协议CustomCalloutView创建MGLCalloutView

我的CustomCalloutView

class CustomAnnotation: NSObject, MGLAnnotation {

var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
var image: UIImage

init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String, image: UIImage) {
    self.coordinate = coordinate
    self.title = title
    self.subtitle = subtitle
    self.image = image
}
}
import Foundation
import Mapbox

class CustomCalloutView: UIView, MGLCalloutView {

var representedObject: MGLAnnotation

lazy var leftAccessoryView = UIView()
lazy var rightAccessoryView = UIView()

weak var delegate: MGLCalloutViewDelegate?

//MARK: Subviews -
let titleLabel:UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.font = UIFont.boldSystemFont(ofSize: 15.0)
    return label
}()

let subtitleLabel:UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

let imageView:UIImageView = {
    let imageview = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
    imageview.translatesAutoresizingMaskIntoConstraints = false
    imageview.contentMode = .scaleAspectFit
    return imageview
}()

required init(annotation: CustomAnnotation) {
    self.representedObject = annotation
    super.init(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: UIScreen.main.bounds.width * 0.5, height: 80.0)))

    self.titleLabel.text = self.representedObject.title ?? ""
    self.subtitleLabel.text = self.representedObject.subtitle ?? ""
    self.imageView.image = annotation.image
    setup()
}

required init?(coder decoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func setup() {
    // setup this view's properties
    self.backgroundColor = UIColor.white

    // And their Subviews
    self.addSubview(titleLabel)
    self.addSubview(subtitleLabel)
    self.addSubview(imageView)

    // Add Constraints to subviews
    let spacing:CGFloat = 8.0

    imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: spacing).isActive = true
    imageView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: spacing).isActive = true
    imageView.heightAnchor.constraint(equalToConstant: 25.0).isActive = true
    imageView.widthAnchor.constraint(equalToConstant: 25.0).isActive = true

    titleLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: spacing).isActive = true
    titleLabel.leftAnchor.constraint(equalTo: self.imageView.rightAnchor, constant: spacing * 2).isActive = true
    titleLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -spacing).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 25.0).isActive = true

    subtitleLabel.topAnchor.constraint(equalTo: self.titleLabel.bottomAnchor, constant: spacing).isActive = true
    subtitleLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: spacing).isActive = true
    subtitleLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -spacing).isActive = true
    subtitleLabel.heightAnchor.constraint(equalToConstant: 20.0).isActive = true
}


func presentCallout(from rect: CGRect, in view: UIView, constrainedTo constrainedRect: CGRect, animated: Bool) {
    //Always, Slightly above center
    self.center = view.center.applying(CGAffineTransform(translationX: 0, y: -self.frame.height))
    view.addSubview(self)

}

func dismissCallout(animated: Bool) {
    if (animated){
        //do something cool
        removeFromSuperview()
    } else {
            removeFromSuperview()
        }
    }
}

我的ViewController

    class ViewController: UIViewController {

    @IBOutlet weak var mapView: MGLMapView!

    override func viewDidLoad() {
        super.viewDidLoad()

        setMapView()
    }

    fileprivate func setMapView() {
        mapView.setUserTrackingMode(.follow, animated: true)
        //mapView.setUserTrackingMode(.follow, animated: true)

        mapView.setCenter(CLLocationCoordinate2D(latitude: 42.9666308, longitude: 47.5126285), zoomLevel: 12, animated: false)
        view.addSubview(mapView)

        mapView.delegate = self

        let hello = MGLPointAnnotation()
        hello.coordinate = CLLocationCoordinate2D(latitude: 42.9666308, longitude: 47.5126285)
        hello.title = "Hello world!"
        hello.subtitle = "Welcome to my marker"

        mapView.addAnnotation(hello)
    }
}

extension ViewController: MGLMapViewDelegate {
    // Use the default marker. See also: our view annotation or custom marker examples.
    func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
        return nil
    }

    // Allow callout view to appear when an annotation is tapped.
    func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
        return true
    }

    func mapView(_ mapView: MGLMapView, calloutViewFor annotation: MGLAnnotation) -> MGLCalloutView? {
        let title = annotation.title ?? nil
        let subtitle = annotation.subtitle ?? nil
        let image = UIImage(named: "star")!
        let customAnnotation = CustomAnnotation(coordinate: annotation.coordinate, title: title ?? "no title", subtitle: subtitle ?? "no subtitle", image: image)

        let customView = CustomCalloutView(annotation: customAnnotation)
        customView.delegate = self

        return customView
    }
}

    extension ViewController: MGLCalloutViewDelegate {
        func calloutViewTapped(_ calloutView: UIView & MGLCalloutView) {
            print("tap callout View")
        }

        func calloutViewDidAppear(_ calloutView: UIView & MGLCalloutView) {
            print("calloutViewDidAppear")
        }

        func calloutViewWillAppear(_ calloutView: UIView & MGLCalloutView) {
            print("calloutViewWillAppear")
        }

        func calloutViewShouldHighlight(_ calloutView: UIView & MGLCalloutView) -> Bool {
            print("calloutViewShouldHighlight")
            return true
        }
    }

为什么我点击CalloutView

  func calloutViewTapped(_ calloutView: UIView & MGLCalloutView) {
        print("tap callout View")
    }

不起作用?

屏幕colloutView

enter image description here

0 个答案:

没有答案