更改iOS地图中的Pin方向

时间:2016-12-17 11:37:46

标签: ios swift3 mkmapview core-location

  • SWIFT 3.0
  • 的MKMapView
  • 的iOS

注意: - (整合AppleMap,不与GoogleMap合作)

我做了以下事情:

  1. 已实施地图并将自定义图像添加到用户位置注释
  2. 当地图打开时,它会在右侧显示用户位置
  3. 我的要求:

      

    当用户移动到不同方向时,停留在同一个地方(或   不同的地方)引脚(在当前位置)应该自动   指出用户指向的方向。

    例如:如果Boat显示在User Location位置并指向North,但如果用户向West移动,那么boat(User Location Pin)也应指向该方向。

    尝试使用以下代码:

    //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方法,但没有运气。

    请分享你的建议我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分: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表示西
  • 介于两者之间的其他一切

下一步是使用这些值并相应地轮换AnnotationViewPin

CGAffineTransformMakeRotation可以为此提供帮助。

例如,如果要旋转到imageview指向东北,这需要度数值为45,那么您的代码可能看起来像这样。

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

请注意,CGAffineTransformMakeRotation()需要一个弧度值,在上面的示例中,我们通过将度数乘以半圆的数量将度数转换为弧度。

以下链接真有帮助:

最后解决了我的问题。希望这个完整的答案也有助于其他人。