2014-09-13 2 views
2

Я пытаюсь дать пользователю возможность ввести адрес и увеличить масштаб карты, который работает.Возможно ли иметь перетаскиваемые аннотации в Swift при использовании MapKit

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

Я пробовал, и я пробовал, но большинство из них, с которыми я могу работать, меняет фактический контакт на пользовательское изображение. Я прошел несколько сообщений и учебников (все для Objective-c), и даже после преобразования кода я все еще не могу заставить это работать.

Мой заказ вид аннотация:

import Foundation 
import MapKit 
class CustomAnnotationView: MKAnnotationView { 

    var coordinate:CLLocationCoordinate2D! 

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

    override init(frame: CGRect) { 
     super.init(frame: CGRect()) 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(annotation: MKAnnotation!, reuseIdentifier: String!) { 
     super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) 
     image = UIImage(named: "pin") 
     draggable = true 
     canShowCallout = true 
    } 

    func setCoordinate(newCoordinate: CLLocationCoordinate2D){ 
     self.coordinate = newCoordinate; 
    } 


} 

Мой контроллер, который находится мой MAPview:

import Foundation 
import MapKit 
class LocationViewController : UIViewController, MKMapViewDelegate { 

    @IBOutlet weak var mapView: MKMapView! 
    @IBOutlet weak var searchField: UITextField! 
    @IBOutlet weak var addressLabel: UILabel! 
    @IBOutlet weak var locationInstructions: UITextView! 


    @IBAction func didTapGoButton(sender: UIButton) { 

     var geocoder = CLGeocoder() 
     geocoder.geocodeAddressString(searchField.text, {(placemarks: [AnyObject]!, error: NSError!) -> Void in 
      if let placemark = placemarks?[0] as? CLPlacemark { 
       var region = self.mapView.region as MKCoordinateRegion 
       region.center = placemark.location.coordinate 
       region.span.longitudeDelta /= 30.0; 
       region.span.latitudeDelta /= 30.0; 

       self.mapView.zoomEnabled = true 
       self.mapView.scrollEnabled = true 
       self.mapView.addAnnotation(MKPlacemark(placemark: placemark)) 
       self.mapView.setRegion(region, animated: true) 
      } 

     }) 
    } 

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { 

     if annotation.isKindOfClass(MKUserLocation) { 
      return nil 
     } 

     var pin = mapView.dequeueReusableAnnotationViewWithIdentifier("CustomAnnotationView") 

     if pin == nil { 
      NSLog("PIN NIL") 
      pin = CustomAnnotationView(annotation: annotation, reuseIdentifier: "CustomAnnotationView") 

     } 
     else 
     { 
      NSLog("PIN NOT NIL") 
      pin.annotation = annotation; 
     } 

     return pin; 
    } 

    func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) { 
     if newState == MKAnnotationViewDragState.Starting 
     { 
      view.dragState = MKAnnotationViewDragState.Dragging 
     } 
     else if newState == MKAnnotationViewDragState.Ending || newState == MKAnnotationViewDragState.Canceling 
     { 
      view.dragState = MKAnnotationViewDragState.None; 
     } 
    } 

Что я упускаю?

Я не могу найти примеры Swift, где это было сделано успешно.

ответ

3

Устанавливаемое свойство coordinate принадлежит к объекту, который реализует протокол MKAnnotation.

Объект, который реализует протокол MKAnnotation, является тем, который вы передаете addAnnotation.


MKAnnotationView класс (и ваш CustomAnnotationView подкласс) НЕ являются объектами, которые реализуют MKAnnotation. Это визуальное представление объектов модели аннотации.


Вот что Location and Maps Programming Guide говорит:

Для реализации минимальной поддержки для перетаскивания:

  • В ваших объектов аннотаций, реализовать метод setCoordinate: в позволяет посмотреть на карте, чтобы обновить аннотацию-х координатная точка.
  • При создании вашего аннотационного представления установите для свойства draggable значение ДА.

Ваши «объекты аннотирования» разные вещи из ваших «взглядов аннотаций».


В didTapGoButton, код добавления аннотации типа MKPlacemark, который делает не осуществить setCoordinate:.

Вместо этого, вы должны будете использовать встроенный в MKPointAnnotation класса, который делает реализовать setCoordinate: или создать свой собственный класс, который реализует протокол MKAnnotation (не подкласс MKAnnotationView) и обеспечивает настраиваемую coordinate недвижимость ,

Таким образом, вместо этого:

self.mapView.addAnnotation(MKPlacemark(placemark: placemark)) 

сделать это:

let pa = MKPointAnnotation() 
pa.coordinate = placemark.location.coordinate 
pa.title = placemark.name //or whatever title you like 
self.mapView.addAnnotation(pa) 

Вы все еще можете сохранить ваш CustomAnnotationView класс, если вам нравится, но это не нужно просто создать вид аннотаций с настраиваемым изображением и ему определенно не требуется свойство координат.

+0

Избавьтесь от CustomAnnotationView. Все работает, но одно изменилось. Когда я нажимаю на контакт, он обычно отображает имя области почтового кода, в который я ввел. Однако теперь он отображает, что я набирал в текстовое поле. В любом случае, чтобы отобразить подробную информацию о том, где был выведен штырь? – LondonGuy

+0

Ok messing с pa.title = placemark.locality и т. Д. Помогает. Наверное, я могу объединить несколько строк. Я рассмотрю свои варианты. Спасибо за помощь – LondonGuy

0

Если вам нужно/предпочитаете работать с MKPlacemark, вы не сможете переопределить свойство координат, поэтому не будете реализовывать setCoordinate: метод для реального, что означает изменение координаты MKPlacemark. Лучшие вещи в этом случае - подкласс MKPointAnnotation и добавление частного свойства типа MKPlacemark. Для получения более подробной информации, пожалуйста, следуйте моему сообщению How to have draggable annotations in Swift when using MKPlacemark

Смежные вопросы