2015-10-17 2 views
4

У меня есть UIViewController, который содержит MKMapView. Я добавил аннотацию на моем текущем местоположении с помощью следующего кода:Как перетащить аннотацию с перетаскиванием MKMapView? (iOS)

import UIKit 
import MapKit 
class LocationViewController: UIViewController , MKMapViewDelegate ,CLLocationManagerDelegate { 
    @IBOutlet weak var mapView: MKMapView! 
    var locationManager: CLLocationManager! 
    let regionRadius: CLLocationDistance = 1000 
    var token: dispatch_once_t = 0 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     mapView.delegate = self 
     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestWhenInUseAuthorization() 
     locationManager.startUpdatingLocation() 
    } 

func centerMapOnLocation(location: CLLocation) { 
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 
     regionRadius * 2.0, regionRadius * 2.0) 
    mapView.setRegion(coordinateRegion, animated: true) 
} 

func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) { 

    if ((userLocation.coordinate.latitude != 0.0) && (userLocation.coordinate.longitude != 0.0)) { 
     dispatch_once(&token) { 
      self.centerMapOnLocation(userLocation.location!) 
      let annotation = MapPin(title: "This Location", locationName: "Test", discipline: "None", coordinate: userLocation.coordinate) 
      mapView.addAnnotation(annotation) 
     } 
    } 
} 

Я хотел бы сделать аннотацию шаг как просмотр карты перемещаются или тащил пользователь. Например, мое текущее местоположение - это Новый Олбани, и если я перетащил карту, то аннотация не изменит ее сцену, плавающую в воздухе, пока я не выйду на вершину Pontotoc, поэтому точки аннотации, которые я выпустил. Я был бы признателен за любые хиты или хорошие уроки на MapKit.

http://i.stack.imgur.com/xGK4R.jpg http://i.stack.imgur.com/4MQIR.jpg

ответ

8

Во-первых, вы должны возвратить представление для аннотирования. Вы можете сделать это так:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    if annotation is MKUserLocation { 
     return nil 
    } 

    let reuseId = "pin" 
    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView 
    if pinView == nil { 
     pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
     pinView?.draggable = true 
    } 
    else { 
     pinView?.annotation = annotation 
    } 

    return pinView 
} 

Затем, когда вы приняли протокол MKMapViewDelegate в контроллере, вы хватаете координаты пальца после перетаскивания его как это:

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) { 
    if newState == MKAnnotationViewDragState.Ending { 
     let droppedAt = view.annotation?.coordinate 
     print(droppedAt) 
    } 
} 

Смотрите также мое sample code.

EDIT

альтернативное решение:

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
    // Remove all annotations 
    self.mapView.removeAnnotations(mapView.annotations) 

    // Add new annotation 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = mapView.centerCoordinate 
    annotation.title = "title" 
    annotation.subtitle = "subtitle" 
    self.mapView.addAnnotation(annotation) 
} 

Не забудьте pinView?.animatesDrop = true в viewForAnnotation.

enter image description here

+0

Я нашел ваш пример кода полезным. Ваш код реализует перетаскиваемый штифт аннотации, в котором вам нужно выбрать контакт, чтобы перетащить его. Я пытаюсь реализовать, что штифт автоматически перетаскивается, когда карта перетаскивается в центр смещенной карты. – user2768374

+0

Я понимаю, что вы хотите сделать, но я не могу найти решение ... –

+0

Я добавил альтернативное решение для моего ответа. удачи! –

1

Существует другое решение. В этом сообщении: determine if MKMapView was dragged/moved, ответ с большинством голосов использует представление UIPanGestureRecognizer на карте. Вы можете использовать это для перемещения булавки, как вы перетаскиваете карту.

-1

You can't get there from here.

Я надеюсь, что это будет исправлено в более поздней версии IOS.

Возможно, проблема связана с обновлением фона.

Это очень раздражает то, что iOS не может делать то, что JavaScript и AJAX делают так легко.

0

Вот код, который будет обновлять аннотацию в близком к реальному времени, когда пользователь перетаскивает или зажимает карту:

var mapRegionTimer: Timer? 
public func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) { 
    mapRegionTimer?.invalidate() 
    mapRegionTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { (t) in 
     self.myAnnotation.coordinate = CLLocationCoordinate2DMake(mapView.centerCoordinate.latitude, mapView.centerCoordinate.longitude); 
     self.myAnnotation.title = "Current location" 
     self.mapView.addAnnotation(self.myAnnotation) 
    }) 
} 
public func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
    mapRegionTimer?.invalidate() 
} 
Смежные вопросы