2017-07-31 10 views
0

注釈を1つずつマップにドロップする必要があります...注釈ピンを左から右にもドロップしてください。注釈ドロップがよりスタイリッシュにする方法と、あなたがアニメーションを制御したい場合は、私はあなたがそれを自分で行うことをお勧めしますMKAnnotation Pinを1つずつ落とす方法は?

func addannotaiton(){ 
    sistermaplist.mapType = MKMapType.standard 
    sistermaplist.removeAnnotations(sistermaplist.annotations) 
    var i = 0 
    let count = mapsisterarray.count 
    let span: MKCoordinateSpan = MKCoordinateSpanMake(1.5,1.5) 
    while (i != count) { 

     let mbr = mapsisterarray[i] 

     if mbr.lat != "",mbr.lon != ""{ 
     let latitude = Double((mbr.lat ?? "0.0")!) 
     let longitude = Double((mbr.lon ?? "0.0")!) 

     let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude!, longitude!) 
     let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span) 
     sistermaplist.setRegion(region, animated: true) 

     let annotation = MKPointAnnotation() 
     annotation.coordinate = location 
     annotation.title = mbr.name ?? "" 

     annotation.subtitle = mbr.meet_place ?? "" 

     sistermaplist.addAnnotation(annotation) 



    } 
     i += 1 
    } 


} 
+0

MKAnnotationピンを削除することはどういう意味ですか?英語では、それを削除したいと思うように聞こえます。しかし、あなたのコードはあなたが1つを追加していることを示唆しています。 –

+0

注釈は、マップするためのドロップとして通常アニメーション化されています。これは、注釈を削除することによって意味したものです –

答えて

0

シンプルがあります。 MKAnnotationViewをサブクラス化して、サブビューとしてピンを追加することができます。ピンをアニメートして、いつでも好きなようにドロップすることができます。

これは、ビューにすべての注釈を同時に追加すると言いますが、移動自体をアニメートします。

ほとんどのコードで行われている非常に簡単な例溶液(マップビューとボタンがストーリーボードにある)であるので、あなたはそれを参照として使用することができますが、いくつかの余分な作業が必要になります...

import MapKit 

class ViewController: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     mapView.delegate = self 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    @IBAction func dropPinsPressed(_ sender: Any) { 

     let coordinates: [CLLocationCoordinate2D] = (0..<50).map { _ in 
      let point = CGPoint(x: CGFloat(Int(arc4random())%1000)/1000.0 * view.bounds.size.width, y: CGFloat(Int(arc4random())%1000)/1000.0 * view.bounds.size.height) 
      return mapView.convert(point, toCoordinateFrom: mapView) 
     } 
     let anotations = coordinates.map { Annotation(coordinate: $0) } 
     let sorted = anotations.sorted { $0.coordinate.longitude < $1.coordinate.longitude } 
     let duration: TimeInterval = 2.0 // overall animation duration 
     let durationFragment = duration/TimeInterval(sorted.count) // Duration between 2 drops 

     sorted.enumerated().forEach { $1.delay = durationFragment*TimeInterval($0) } 

     mapView.addAnnotations(sorted) 
    } 

} 

extension ViewController: MKMapViewDelegate { 

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
     return PinView(animateDropFrom: view.frame.size.height, delay: (annotation as? Annotation)?.delay ?? 0.0) 
    } 

} 

fileprivate extension ViewController { 

    class Annotation: NSObject, MKAnnotation { 
     var coordinate: CLLocationCoordinate2D 
     var delay: TimeInterval = 0.0 

     init(coordinate: CLLocationCoordinate2D) { 
      self.coordinate = coordinate 
     } 
    } 

} 

fileprivate extension ViewController { 

    class PinView: MKAnnotationView { 

     lazy var pinView: UIView = { 
      let view = UIView(frame: self.bounds) 
      view.backgroundColor = UIColor.red 
      self.addSubview(view) 
      return view 
     }() 

     convenience init(animateDropFrom height: CGFloat, delay: TimeInterval) { 
      self.init(frame: CGRect(x: 0.0, y: 0.0, width: 10.0, height: 20.0)) 

      pinView.frame = CGRect(x: bounds.origin.x, y: bounds.origin.y-height, width: bounds.size.width, height: bounds.size.height) 

      UIView.animate(withDuration: 0.3, delay: delay, options: [.curveEaseIn], animations: { 
       self.pinView.frame = self.bounds 
      }, completion: nil) 
     } 

    } 

} 

デザインの次の最大の問題は、現在のマップをスクロールしてから元に戻すと、ピンが再びドロップされることです。 Annotationはカスタムサブクラスなので、おそらくそのクラスに垂直オフセットを追加するだけです。次に、最初にアニメーションを作成したときにオフセットをゼロにリセットすると、再びアニメーション化されません。これがあなたの期待される行動でない限り...

関連する問題