如何让用户添加自定义注释?

时间:2019-02-07 10:14:33

标签: swift xcode mapkit mkannotation

我找不到任何文档,视频或堆栈溢出答案。

这是我的问题。我创建了地图并将其添加到自定义MKAnnotation和MKAnnotationView中。

我想让用户创建自定义图钉并通过CoreData保存到本地

MyCustomAnnotation具有相同的属性,即标题,副标题和坐标。

我想到的第一个解决方案是放置一个按钮,该按钮创建到用户位置的可拖动图钉。

但是我需要得到更简单,更复杂的解决方案。

private func addPins() {
    let list = PrivateLocations.shared.initLocations()
    for pin in list {
        map.addAnnotation(pin)
    }
}

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

    if view.annotation is MKUserLocation { return }
    let views = Bundle.main.loadNibNamed("CustomCalloutView", owner: nil, options: nil)
    let customView = views?[0] as! CustomCalloutView
    customView.delegate = self
    customView.isUserInteractionEnabled = true
    customView.titleLabel.text = view.annotation?.title!
    customView.desc.text = view.annotation?.subtitle!
    customView.center = CGPoint(x: view.bounds.size.width / 2, y: -customView.bounds.size.height*0.52)
    view.addSubview(customView)
    map.setCenter((view.annotation?.coordinate)!, animated: true)
}

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is MKUserLocation {
        return nil
    } else {
        let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "CustomAnnotationView")
        annotationView.image = UIImage(named: "myImage")
        annotationView.canShowCallout = false
        return annotationView
    }
}

最后这是我的CustomPin类:

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

init(_ title: String, _ subtitle: String, _ coordinate: CLLocationCoordinate2D) {
    self.title = title
    self.subtitle = subtitle
    self.coordinate = coordinate
}

1 个答案:

答案 0 :(得分:0)

这就是我解决这个问题的方式,

1)为要在其中添加注释的用户显示创建一个UIView。

2)在其中添加一个平移手势识别器。

{
  "sub"       : "alice",
  "iss"       : "https://openid.c2id.com",
  "aud"       : "client-12345",
  "nonce"     : "n-0S6_WzA2Mj",
  "auth_time" : 1311280969,
  "acr"       : "c2id.loa.hisec",
  "iat"       : 1311280970,
  "exp"       : 1311281970
}

3)在选择器函数中,我调用pinDropped()函数

func addPanGesture(view: UIView) {
    let pan = UIPanGestureRecognizer(target: self, action: #selector (self.handlePan(sender:)))
    view.addGestureRecognizer(pan)
}

4)我写了pinDropped函数中将发生的事情

  @objc func handlePan(sender: UIPanGestureRecognizer) {

    let view = sender.view!
    let translation = sender.translation(in: self.mapView)

    switch sender.state {
    case .began, .changed:
        pinImage.center = CGPoint(x: dropPinImage.center.x + translation.x, y: dropPinImage.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: view)
        break
    default:
        pinDropped()
        break
    }
}