需要将注解一一拖入地图中...甚至从左到右放置注解图钉。有没有一种方法可以使注释放置更加时尚和简单
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
}
}
最佳答案
如果您想控制动画,我建议您自己做。您可以为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
是自定义子类,您可能应该仅将垂直偏移量添加到该类中。然后,当您第一次对其设置动画时,将偏移量重置为零,它将不再对其进行动画处理。除非这是您的预期行为...关于ios - 如何一一放下MKAnnotation引脚?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45415107/