2016-12-17 5 views
0
  • СВИФТ 3,0
  • MKMAPVIEW
  • IOS

Примечание: - (Integrated AppleMap, не работает с GoogleMap)Изменение Pin направление в IOS Карта

I h Ава сделать следующее:

  1. Реализовано карта и новый пользовательские изображения для пользователя Места Аннотации
  2. Когда карта открыта, она показывает пользователь Место в нужном месте

Моего Требование:

Когда пользователь перемещается в другом направлении, оставаясь в одном и том же месте (или разное место), контакт (в текущем месте) должен au томально укажите направление, в котором пользователь указывает.

Например: Если судно отображается в позиции местоположения пользователя и указывает на север, но если пользователь движется в сторону запада, тогда лодка (контакт местоположения пользователя) также должна указывать на это направление.

Пробовал с помощью следующего кода:

//MARK:Change Direction Methods 

    func angle(fromCoordinate first: CLLocationCoordinate2D, toCoordinate second: CLLocationCoordinate2D) -> Float { 
     let deltaLongitude = second.longitude - first.longitude 
     let deltaLatitude = second.latitude - first.latitude 
     let angle = (.pi * 0.5) - atan(deltaLatitude/deltaLongitude) 
     if deltaLongitude > 0 { 
      return Float(angle) 
     } 
     else if deltaLongitude < 0 { 
      return Float(angle) + .pi 
     } 
     else if deltaLatitude < 0 { 
      return .pi 
     } 

     return 0.0 
    } 

    //Animate direction of User Location 
    func animateUserLocation() { 

     //Old Coordinate (PLAT - Previous Lat , PLON - Previous Long) 
     let oldLocation = CLLocationCoordinate2D(latitude: UserDefaults.standard.value(forKey: "PLAT") as! CLLocationDegrees, longitude: UserDefaults.standard.value(forKey: "PLON") as! CLLocationDegrees) 

     //New Coordinate (PLAT - Current Lat , PLON - Current Long) 
     let newLocation = CLLocationCoordinate2D(latitude: UserDefaults.standard.value(forKey: "LAT") as! CLLocationDegrees, longitude: UserDefaults.standard.value(forKey: "LON") as! CLLocationDegrees) 

     let getAngle = angle(fromCoordinate:oldLocation, toCoordinate:newLocation) 
     var myAnnotation : RestaurantAnnotation? 
     if annotationArray.count > 0{ 
      myAnnotation = annotationArray[0] 
     } 
     else { 
      return 
     } 

     UIView.animate(withDuration: 2, animations: {() -> Void in 
      myAnnotation?.coordinate = newLocation 
      let annotationView = self.map.view(for: myAnnotation!) 
      annotationView?.transform = CGAffineTransform(rotationAngle: CGFloat(getAngle)) 
     }) 

     //Save Previous lat long 
     UserDefaults.standard.set(UserDefaults.standard.value(forKey: "LAT"), forKey: "PLAT") 
     UserDefaults.standard.set(UserDefaults.standard.value(forKey: "LON"), forKey: "PLON") 
     UserDefaults().synchronize() 
    } 

Вызывается animateUserLocation метод из didUpdateLocation метод, но не повезло.

Пожалуйста, поделитесь своим предложением, что я делаю неправильно. Заранее спасибо.

ответ

4

Концепция местоположения iOS's полностью помогает решить любую проблему, касающуюся AppleMap.

Чтобы переместить карту Pin или AnnotationView, мы можем использовать структуру CoreLocation, которая выводит данные, относящиеся к текущему местоположению пользователей.

import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 
    var locationManager:CLLocationManager! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.startUpdatingHeading() 
    } 

    func locationManager(manager: CLLocationManager!, didUpdateHeading heading: CLHeading!) { 
    // This will print out the direction the device is heading 
    println(heading.magneticHeading) } 
    } 
} 

В приведенном выше примере, «heading.magneticHeading» будет выводить значение, представляющее направление устройства указал на.

  • 0 означает север
  • 90 означает восток
  • 180 означает юг
  • 270 означает, что запад
  • все остальное между

Следующим шагом будет использовать эти значения и вращать ваш AnnotationView или Pin соответственно.

CGAffineTransformMakeRotation может помочь в этом.

Например, если вы хотите повернуть на изображение, чтобы указать на северо-восток, для чего потребуется значение градуса 45, ваш код может выглядеть примерно так.

float degrees = 45 
imageView.transform = CGAffineTransformMakeRotation(degrees * M_PI/180) 

Просто надо знать, что ожидает CGAffineTransformMakeRotation() радианы значения, в примере выше мы преобразованные градусы в радианы путем умножения степеней с числом полукругов.

Следующие ссылки действительно полезные:

Наконец Решенный мой вопрос. Надеюсь, этот полный ответ поможет и другим.